단계별로 살펴 봅니다. foldl
의 유형은 where
문이 두 값을 사용하고 세 번째를 반환하는 기능 f'
를 정의
foldl :: (a -> b -> a) -> a -> [b] -> a
입니다. 우리는 그 시간에 알 수 있도록 모든 f
는 다음과 같은 유형이있다이다 : 두 가지 유형이 같을
f' :: a -> b -> c
if ... then A else B
이후의 요구에,이 함수는 Bool
(첫 번째 지점을 반환 True
)을 반환 것이라고 결론 지었다. 따라서
f' :: a -> b -> Bool
그러나 두 번째 분기는 첫 번째 인수를 반환합니다. 따라서 첫 번째 인수는 Bool
이어야합니다 (그렇지 않으면 foldl
으로 사용할 수 없습니다. 위 참조).
f' :: Bool -> b -> Bool
는 x == a
때문에, 이것은 x
a
가 동일한 유형이어야한다는 것을 나타낸다. 우리가 myElem'
에 모습을 알고 있다면, 우리는 a
유형 Int
의 것을 볼, 따라서 귀하의 보조 기능 f'
는 f'
의 정의에
f' :: Bool -> Int -> Bool
x
을 입력있다 xs
동일하지 않습니다. 대신 그것은 단지 다른 변수 일뿐입니다. foldl
은 xs
을 통과하고 모든 요소에 f'
을 사용하여 목록을 하나의 단일 값으로 줄입니다.
작동 방식은 요소가 이미 발견 된 경우에도 항상 전체 목록을 통과한다는 것입니다. – Ingo
@Ingo 그렇지 않습니다. 'myElem '0 [undefined, 0]'그리고 나서'myElem'1 [undefined, 0]'을 시도하십시오. 첫 번째 경우는 오류를주는 대신'True'를 반환합니다. 왜냐하면''undefined '는 첫 번째'0 '이 나온 이후이므로 결코 평가하지 않습니다. 또한, where 절은'f '로 쓰여질 수있다. b x = a == x || b' – user2407038