, 우리가 스왑 아웃 한
copy :: Int -> a -> Maybe [a]
copy 0 _ = Just []
copy n a | n < 0 = Nothing
| otherwise = fmap (a:) (copy (n-1) a)
의 라인을 따라 뭔가 더
foo bar | baz = quux
| ...
그냥하는 "보호"에 대한 if
있다고하고 좋을 것
foo bar = if baz then quux else ...
코드도 약간 변경되었습니다.
[a] ++ copy (y-1) a ====> fmap (a:) (copy (y-1) a)
(:)
을 추가로 생각할 수 있습니다.
1 : [2, 3] ==> [1, 2, 3]
[1] ++ [2, 3]
의 대체 방법입니다. "구조물"처럼 "죄수"라고 소리내어 말하십시오. 우리는 이것을 연산자 섹션으로 쓸 수 있습니다
(a:) ==> \x -> a : x
다음으로 우리는이 우키 한 fmap
함수를 사용합니다. 이
fmap f Nothing = Nothing
fmap f (Just x) = Just (f x)
처럼 fmap
생각은 그래서는 Just
을 펼쳤다하고 결과를 재배치하기 전에 기능을 적용합니다. 따라서 숫자가 음수이면 최종 코드는 Nothing
을 반환하고, 그렇지 않으면 목록 만 반환합니다.
내가 추천하지 않는 이유는 무엇입니까 error
?자, error
은 아주 간단한 정보로 전체 프로그램을 날려 버릴 것이고 그것을 잡으려고하는 것은 나쁜 생각입니다. Haskell은 그렇게 할 수 있다고 명령하지도 않으며, GHC는 단지 error
을 가능하게 구현합니다. 즉, 회복 할 기회가 거의 없습니다.
이것은 10 줄의 코드에는 큰 문제가 아니지만 error
을 사용하는 함수 호출에 대한 검색에는 6 시간 이상을 소비했습니다. 디버깅이 훨씬 빠르며 관용적 인 haskell이 더 빠릅니다.
"잘못된 입력"을 정의하십시오. (또한 실제 질문에 대한 대답은 "예"입니다.) –
'error'를 호출하면 프로그램이 오류 메시지와 함께 중단됩니다. 함수의 반환 유형 (즉 :'String [a]'또는'Maybe [a]')에서 에러를 인코딩 한 다음, 함수에서 각각 "Left err"또는 "Nothing"을 확인해야합니다. 'copy'를 호출합니다. –