smasuda
まったくの思いつきで恐縮ですが、
forkIO
で別スレッドで処理される中で、コネクションの`close`が意図するタイミングで呼ばれていない可能性はありませんか?forkIO
で別スレッドで処理される中で、コネクションの`close`が意図するタイミングで呼ばれていない可能性はありませんか?insertLog db' lf
を bracket
を使うようにするとどうでしょうか。bracket
を利用しましたが同様の挙動になりました.insertLog :: String -> LogField -> IO() insertLog db' lf = bracket (open db') close $ \conn -> execute conn "INSERT INTO log VALUES (null,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" lf
たしか、現在の実装では、当該データベース ファイルに対する更新処理はジャーナル ファイルにいったん保持した後、ジャーナルの世代が古い順からトランザクションとして処理していき(FIFO)、最終的にジャーナル ファイルがなくなるまでファイルを更新し続けます。
その際、更新処理が多重で走ることによりジャーナルをデータベース ファイルに適用するのが間に合わなくなってくると、ロックに関する例外を吐くようになります。
forkIO
を止めて同期的に書き込むだけで若干改善されませんかね(もちろんその分動作は遅くなりますが)(>>)
の第2引数に渡した関数しか実行されない という落とし穴があるようです。 :scream:> a x y = putStrLn ("a: " ++ x ++ y) > b x y = putStrLn ("b: " ++ x ++ y) > ((>>) <$> a <*> b) "x" "y" b: xy
...みたいなふるまいをしていますね
((<*>) <$> (((<$>) (>>)) . a) <*> b) "x" "y"
((>>) <$> a <*> b) "x" "y" ((fmap (>>) a) <*> b) "x" "y" (((>>) . a) <*> b) "x" "y" ((\arg -> ((>>) (a arg))) <*> b) "x" "y" ((\arg2 -> (\arg -> ((>>) (a arg))) arg2 (b arg2))) "x" "y" ((\arg2 -> (\arg -> (\k -> (a arg >>= (\_ -> k)))) arg2 (b arg2))) "x" "y" ((\arg2 -> (\arg -> (\k -> (a arg >>= (\_ -> k)))) arg2 (b arg2))) "x" "y" -- Monadの (>>) を展開 ((\arg2 -> (\arg -> (\k -> (\r -> (\_ -> k) (a arg r) r))) arg2 (b arg2))) "x" "y" -- (-> r) Monadの (>>=) を展開 (\arg2 -> (\arg k r -> (\_ -> k) (a arg r) r) arg2 (b arg2)) "x" "y" -- 入れ子になったλ式をくっつける (\arg2 -> (\arg k r -> k r) arg2 (b arg2)) "x" "y" -- (\_ -> k) (a arg r) を簡約。aが消えた! (\arg2 -> (\r -> (b arg2) r)) "x" "y" -- (\arg k r -> k r) arg2 (b arg2) を簡約。 (\r -> (b "x") r) "y" -- (\arg2 -> (\r -> (b arg2) r)) "x" を簡約。 (b "x") "y" -- (\r -> (b "x") r) "y" を簡約。
do
に直したら unused-do-bind
の警告になりましたね。do a b
()
以外の)アクションに対して (>>)
を使うと警告が出る、みたいな仕組みを作るといいのかもしれません。(>>)
は第一引数のアクションの戻り値を捨てる関数だから、警告出すのは微妙な気がしますね……。 const 1 (f x)
って書いたときに (f x)
は評価されないよーっていう警告を出すかどうかみたいな。buildA = runSTUArray $ do a <- newArray (0,2) 0 :: ST s (STUArray s Int Int) writeArray a 0 999 -- detail omitted return a λ> a = buildA a :: U.UArray Int Int λ> a U.! 0 999
buildAB = runSTUArray $ do a <- newArray (0,2) 0 :: ST s (STUArray s Int Int) b <- newArray (1,9) 1 :: ST s (STUArray s Int Int) writeArray a 0 999 writeArray a 1 111 -- detail omitted return (a, b) • Couldn't match type ‘(STUArray s Int Int, STUArray s Int Int)’ with ‘STUArray s i e’ Expected type: ST s (STUArray s i e) Actual type: ST s (STUArray s Int Int, STUArray s Int Int)
viewThenSet :: Sample -> Lens' Sample Int -> (Int, Sample)
Lens
を受け取る関数を使って、main = print . viewThenSet (Sample 1 2) $ field' @"sample1"
Functor f
が曖昧だよ!という型エラーになってしまいます(エラーメッセージの詳細はコードにコメントとして張りました)。.
の代わりに $
を使い、 :point_down: のように書き換えると、エラーがなくなります(あるいは、どちらも使わずに括弧で囲うか)。main = print $ viewThenSet (Sample 1 2) $ field' @"sample1"
f $ g $ x
という式は f . g $ x
という式に書き換えられることが知られてますが、なぜこの場合は .
を使うと型エラーになるのでしょうか?main = print $ viewThenSet (Sample 1 2) $ field' @"sample1"
runSTArray
https://www.stackage.org/haddock/lts-13.24/array-0.5.3.0/src/Data-Array-ST.html#runSTArray がやっているように、 GHC.Arr.unsafeFreezeSTArray
を自前で呼んで runST
すればよいのではないかと思います。{-# LANGUAGE RankNTypes #-} rankNfunc :: (forall a. Show a => a->b) -> [b] rankNfunc f = [f 42, f True] f = length $ rankNfunc $ show -- OK g = length . rankNfunc $ show -- NG
$
の特別扱いの話は以前記事を書いたので参考までに: https://qiita.com/mod_poppo/items/806c9c3e0ccb46be92ae#%E9%96%A2%E6%95%B0%E9%81%A9%E7%94%A8%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%AE%E7%89%B9%E4%BE%8B{-# LANGUAGE ImpredicativeTypes #-}
をつけると g = (length . rankNfunc) show
はいけるようになるのに g = length . rankNfunc $ show
だとだめなままなのはなんでだろう… ($)
の特別扱いが逆に悪さしてるんですかねa
と b
の初期化は絡み合っていて 分離は出来ませんNot in scope: ‘GHC.Arr.unsafeFreezeSTUArray’ No module named ‘GHC.Arr’ is imported.
import GHC.Arr (unsafeFreezeSTUArray)
してください。そういう意味です。(length . rankNfunc) show
が通るけれど 8.4.4 と 8.6.3 では ImpredicativeTypes をつけてもダメっぽいGHC.Arr.
をつけずに unsafeFreezeSTUArray
と呼べばいいはずですが...@"sample1"
ってなんだろうとおもったら、これ、 TypeApplications と DataKinds のコンボですか?... import GHC.Arr (unsafeFreezeSTUArray) ... buildA' = runST $ do a <- newArray (0,2) 0 :: ST s (STUArray s Int Int) writeArray a 0 999 -- detail omitted a >>= unsafeFreezeSTUArray