昔の GHC だと、UNPACK で Strict な小さな値は、ポインターではなく即値が格納されるようになります。
しかし、現在の GHC は UNPACK は必要なく、Strict で小さければ、既値が格納されます。
しかし、現在の GHC は UNPACK は必要なく、Strict で小さければ、既値が格納されます。
import qualified Data.Vector.Sized as V class Raccum a where raccum :: a -> a instance Num a => Raccum (Vector 1 a) where raccum = id instance Num a => Raccum (Vector m a) where raccum v = V.cons (V.sum v) (raccum $ V.tail v)
(Num a, m ~ (1+n), Raccum (Vector n a)) =>
のように変更するとコンパイルは通るが実行時に Overlapping instances
で怒られるCouldn't match type '1' with '0' arising from a use of 'raccum'
と怒られるinstance (KnownNat m, KnownNat n, Num a, m ~ (1+n), Raccum (Vector n a)) => Raccum (Vector m a) where raccum v | m == 1 = v | otherwise = V.cons (V.sum v) (raccum $ V.tail v) where m = natVal (Proxy @m)
Illegal type synonym family application 'n + 1' in instance
と怒られるんですよね、、instance (Raccum (Vector n a), Num a) => Raccum (Vector (n+1) a) where raccum v = V.cons (V.sum v) (raccum $ V.tail v)
data NatCons (n :: Nat) where Zero :: NatCons 0 Succ :: (KnownNat n, m ~ (1 + n)) => Proxy n -> NatCons m {-# NOINLINE natCons #-} natCons :: KnownNat n => Proxy n -> NatCons n natCons proxy = case sameNat proxy (Proxy :: Proxy 0) of Just Refl -> Zero Nothing -> case someNatVal (natVal proxy - 1) of SomeNat proxy' -> unsafeCoerce (Succ proxy')
forall r. m r -> (a -> r -> m r) -> m r
でいいんですよね。これってモナドにするときに Monad m
が必要ということで合ってますよね?createSourceFile :: IO () createSourceFile = do writeFile "input.txt" "This is a test." s3Upload :: IO () s3Upload = do createSourceFile logger <- newLogger Debug stdout env <- newEnv Discover <&> set envLogger logger . set envRegion Tokyo runResourceT . runAWST env $ do body <- chunkedFile defaultChunkSize "./input.txt" void . send $ putObject (BucketName "test-bucket") (ObjectKey "output.txt") body
chunkedFile
という関数を噛ませていることから、Streamに読み込みながらアップロードしているという認識で合っているでしょうか?amazonka-s3-streaming
というパッケージもありますが、Streamにアップロードする上で特にこれは不要でしょうか?resolver: lts-13.18 packages: - . extra-deps: - conduit-1.3.4 - amazonka-1.6.1 - amazonka-s3-1.6.1 - amazonka-s3-streaming-1.0.0.1 - http-client-0.5.14 - text-1.2.3.1 - lens-4.17
chunkedFile
という関数を噛ませていることから、Streamに読み込みながらアップロードしているという認識で合っているでしょうか?
気になって実装読んでましたがその通りStreamに読み込みながらアップロードしてそうです:eyes:amazonka-s3-streaming
は不要に見えますね:eyes:putObject
が呼ぶAPIとはまた別物みたいです。Network.AWS.S3
以下のモジュールは、S3のREST APIに対する各APIと一対一に対応しているようでして、`putObject` の定義元である Network.AWS.S3.PutObject
は、名前のとおりPutObjectという命令 https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html を呼んでいるものと推測されます。CreateMultipartUpload
や CompleteMultipartUpload
といった、マルチパートアップロードで使用するAPIだからです。send から最終的には http-conduit の http 関数を利用して送信していますなるほど、amazonkaは内部でconduit(ストリーミングライブラリですよね)を使っていたんですね。
ChunkedFileを使って1mb以上のファイルを扱う際に、次のバグを踏みそうに見えます。ありがとうございます、このバグしっかり踏みましたw
確認なのですが、謝辞としてhaskell-jpに相談させて頂きましたと一言追記することは良いでしょうか?問題ないと思います :ok_woman:
おわりに
の中に追記させて頂きました!I believe that we should stop using `package.yaml` given that now Stack is deprecating it and Cabal supports common stanzasというやり取りを見てちょっとびっくりしたのですが、今のHaskell開発はStackを使わない流れになっているのでしょうか?