2013-10-20 7 views
0

하스켈을 처음 사용했습니다. 정수형이리스트에 포함되어 있는지를 검사하는 코드 조각이 있습니다.where 문을 사용하는 방법?

myElem' :: Int -> [Int] -> Bool 
myElem' a xs = foldl f' False xs 
    where f' b x = if x==a then True else b 

코드가 '위치'에서 어떻게 작동하는지 이해할 수 없습니다. 저는 f '가 표현이고 전체 문장이 f'를 정의하는 데 사용된다는 것을 압니다. b는 부울이어야하지만 그 이유는 무엇입니까? x가 xs와 같은가요? 많은 감사합니다!

+0

작동 방식은 요소가 이미 발견 된 경우에도 항상 전체 목록을 통과한다는 것입니다. – Ingo

+0

@Ingo 그렇지 않습니다. 'myElem '0 [undefined, 0]'그리고 나서'myElem'1 [undefined, 0]'을 시도하십시오. 첫 번째 경우는 오류를주는 대신'True'를 반환합니다. 왜냐하면''undefined '는 첫 번째'0 '이 나온 이후이므로 결코 평가하지 않습니다. 또한, where 절은'f '로 쓰여질 수있다. b x = a == x || b' – user2407038

답변

3

단계별로 살펴 봅니다. 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 때문에, 이것은 xa가 동일한 유형이어야한다는 것을 나타낸다. 우리가 myElem'에 모습을 알고 있다면, 우리는 a 유형 Int의 것을 볼, 따라서 귀하의 보조 기능 f'f'의 정의에

f' :: Bool -> Int -> Bool 

x을 입력있다 xs 동일하지 않습니다. 대신 그것은 단지 다른 변수 일뿐입니다. foldlxs을 통과하고 모든 요소에 f'을 사용하여 목록을 하나의 단일 값으로 줄입니다.

+0

정말 고마워요. 제타. 당신은 그것을 아주 분명하게했습니다! :) – Peine

관련 문제