ハスケルの関数の構成を理解しようとしています。ハスケル複合関数の構成
ZVON http://zvon.org/other/haskell/Outputprelude/filter_f.html
によると、フィルタ関数には2つの引数、bool関数とリストが必要です。
例filter (>5) [1,2,3,4,5,6,7,8]
が5を超えるものを返す: [6,7,8]
質問、どのようにいくつかの機能の組成物と次の行が利用するフィルタのブール値を渡していますか?
map fst . filter snd . assocs . soeA
それは地図FSTすべきではありません。フィルタ(== True)snd。 assocs。 soeAの各アレイ素子にどういうわけassocs . soeA $ 9
戻り [(0,False),(1,False),(2,True),(3,True),(4,False),(5,True),(6,False),(7,True),(8,False),(9,False)]
soe 9
戻り[2,3,5,7]
ブール値が使用されているが、私は、組成物の最初の二つの機能を実行し、引数を渡す分析するsoeA
この構成がどのように機能しているかを説明する助けは非常に高く評価されるでしょう。
完全なコードは次のとおりです。 `
module FastSeive where
import Control.Monad
import Control.Monad.ST
import Data.Array.ST
import Data.Array.Unboxed
soeST :: forall s. Int -> ST s (STUArray s Int Bool)
soeST n = do
arr <- newArray (0, n) True
mapM_ (\i -> writeArray arr i False) [0, 1]
let n2 = n `div` 2
let loop :: Int -> ST s()
loop i | i > n2 = return()
loop i = do
b <- readArray arr i
let reset :: Int -> ST s()
reset j | j > n = return()
reset j = writeArray arr j False >> reset (j + i)
when b (reset (2*i))
loop (succ i)
loop 2
return arr
soeA :: Int -> UArray Int Bool
soeA n = runST (soeST n >>= freeze)
soe :: Int -> [Int]
soe = map fst . filter snd . assocs . soeA
soeCount :: Int -> Int
soeCount = length . filter id . elems . soeA
`
ありがとうございました。 "soe x = map fst(filter snd((assocs。soeA)x))") "本当に助けになった – brander