하스켈에서 기능 구성을 이해하려고 시도하고 있습니다.하스켈 다중 기능 구성
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해서는 안됩니다. 필터 (== 참) 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
복귀 여하튼 SOEA의 각 배열 요소에 불리언 값이 사용되고
[2,3,5,7]
, 그러나 이 구성이 어떻게 작동하는지 설명하는 도움은 대단히 감사하겠습니다.
전체 코드는 다음과 같습니다 `
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