我試圖瞭解Haskell中的函數組合。Haskell多功能組合
根據ZVON http://zvon.org/other/haskell/Outputprelude/filter_f.html
過濾器函數應該有兩個參數,一個bool函數和一個列表。
例filter (>5) [1,2,3,4,5,6,7,8]
返回任何大於5: [6,7,8]
問題,如何以下行具有若干功能的組合物在一個布爾通爲濾波器利用?
map fst . filter snd . assocs . soeA
它不應該是地圖FST。過濾器(== True)snd。聯合。 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