나는 Haskell을 배우고 있으며 이해하기 어려운이 동작을 우연히 발견했을 때 Yesod에 대한 간단한 DB 시드 프로그램을 수행하고있었습니다.
testFn :: Int -> Bool -> [Int]
testFn a b = if b then replicate 10 a else []
Yesod GHCI 세션 :
$ :t concatMap testFn [3]
concatMap testFn [3] :: Bool -> [Int]
$ (concatMap testFn [1,2,3]) True
[1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3]
어떻게 든 각 매핑에서 두 번째 "Bool"을 단일 커리 인수로 "풀"할 수있었습니다.
표준 기본 Prelude GHCI 세션은이 표현식을 컴파일하지도 않습니다.
$ :t concatMap testFn [3]
error:
• Couldn't match type 'Bool -> [Int]' with '[b]'
Expected type: Int -> [b]
Actual type: Int -> Bool -> [Int]
• Probable cause: 'testFn' is applied to too few arguments
In the first argument of 'concatMap', namely 'testFn'
In the expression: concatMap testFn [3]
Yesod 사용하는 끈다는 모노 -에 이동 그것의 자신의 라이브러리를 concatMap
:
$ :t concatMap
concatMap
:: (MonoFoldable mono, Monoid m) =>
(Element mono -> m) -> mono -> m
현재의 Haskell 이해 수준에서 여기에 유형이 어떻게 분포되어 있는지 알 수 없었습니다. 누군가이 트릭이 어떻게 수행되는지 나에게 (가능한 한 초보자 지향) 설명 할 수 있습니까? testFn
위의 어느 부분이 Element mono
유형을 준수 합니까?