은 무한한 목록에서이 제대로 작동하지만 하프웰 코드는 정상적으로 작동하지 않습니다.하지만 이해할 수 없습니다. 이유가이므로 성공적으로 수행 할 수 있습니다. (전 원래 코드를 수정하여 무한한 목록을 처리하지 못했지만 온라인에서 다른 코드의 내용을 통합 할 수있었습니다. 갑자기이 코드는 작동하지만 왜 그런지는 알 수 없습니다). foldr의왜이 Haskell 코드가 무한리스트와 함께 성공적으로 작동합니까?
myAny :: (a -> Bool) -> [a] -> Bool
myAny p list = foldr step False list
where
step item acc = p item || acc
나의 이해는이 목록에있는 모든 항목을 통해 루프 (그리고 아마도 그 이해가 불완전) 것입니다. 그렇다면 "단계"기능이 어떻게 표현되는지는 중요하지 않습니다 ... 코드가 무한 루프를 처리 할 수 없어야합니다. 그러나
다음 작품 :*Main Data.List> myAny even [1..]
True
나를 이해하는 데 도움이 바랍니다 : 왜?
또한 코드가 두 개 이상의 요소를 계산하지 않는다는 것을 확인할 수 있습니다 :'myAny p list = foldr (\ iia -> trace (show i) (pi || a))''- True' – viraptor
와우, 이것은 매우 눈을 뜨게하는 반응이었습니다. 우선, 나는 나 앞에서 foldr의 정의로 시작하지 않았다. 나는 그 코드가 아직 모르는 고급 기능을 사용할 것이라고 생각했기 때문에 최후의 수단으로 만 보았습니다. 귀하의 답변을 통해 제가 한 번 더 살펴보고 많은 것을 명확히했습니다. foldr 자체는 "평범한 구식"구조 재귀를 사용하고 있습니다. 네가 그걸 깨뜨린 것을 사랑해. 감사. –
BTW는 || 최초의 arg에서 완전하게 엄격한가, 또는 단지 최초의 인수를 「우선한다」것인가. 예를 들어, arg 2가 이미 eval 된 적이 있었지만 arg 1이 여전히 단순한 썽크 였다면 어떨까요? arg 2가 거짓이라고 말하십시오. 하스켈은 반대 방향으로 단락 되었습니까? 감사. –