我试图了解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