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