2017-03-14 1 views
0

Haskell에서 n 번째 요소 뒤의 두 위치로 목록을 분할하는 함수를 작성하려고합니다.Haskell splitAt 함수 (오류 처리기 사용)

지금까지 다음과 같은 코드가 있습니다 :

splitAt n (z:zs) | n > 0 = (z:zs', zs'') where (zs', zs'') = split (n-1) zs 

이 기능은 또한 오류 메시지 "를 반환해야합니다 :

data Err e = Bad|Good e 

splitAt:: Int -> [a] -> Err(([a],[a])) 
splitAt 0 zs = Good(([], zs)) 
splitAt n _ = Bad 

나는 다음과 같은 경우에 오류 메시지를 적용하는 방법을 잘 모르겠습니다 숫자가 목록의 길이보다 크거나 숫자가 음수이면 "Bad"입니다. 예 :

splitAt 6 [1,2,3,] = Bad 
splitAt (-3) [1,2,3] = Bad 

모든 조언을 주시면 감사하겠습니다.

+0

왜 '오류'를 사용합니까? 그것이'어쩌면'에 대한 것이며, 당신이 그것을 사용하면 당신을 도울 수있는 전체 도서관이 있습니다. – Carcigenicate

+0

하스켈을 처음 사용하고 다형성 유형을 사용하여 연습하고 싶습니다. – NoahSM1993

+0

오, 알았습니다. Err 유형이 Haskell 's Maybe의 최소 버전이라는 것을 알아 두십시오. "실제 코드"에서 대신 Maybe를 사용하도록 선택하십시오. – Carcigenicate

답변

0

이것은 어떻게 구현할 것입니다. Functor 인스턴스는 편의상 splitAt 함수에서 case ... of과 같은 것을 피하기위한 것이며 Maybe과 정확히 동일하게 작동합니다. 귀하의 버전이 splitAt이므로 다른 값을 반환 할 수 있기 때문에 Good (zs',zs'') = ...과 같은 패턴 일치를 수정 한 후에 이 반환 된 경우 예외가 발생하고 그 반대의 경우도 게시 한 where으로 예제를 수정할 수 없습니다.

data Err e = Bad|Good e deriving (Eq, Show) 

    instance Functor Err where 
    fmap _ Bad  = Bad 
    fmap f (Good a) = Good (f a) 

    splitAt' 0 zs = Good ([],zs) 
    splitAt' n [] = Bad 
    splitAt' n (z:zs) 
    | n > 0  = fmap (\(zs',zs'') -> (z:zs',zs'')) (splitAt' (n-1) zs) 
    | otherwise = Bad 

이 정보가 도움이되기를 바랍니다. 뭔가 명확하지 않은지 물어보십시오.