2014-01-13 2 views

답변

7

당신은 do_something 당신의 선언에 (String, String, Int)의 목록은 모든 경우를 지정해야합니다. do_something에 전달 된 인수가 비어 있거나 요소가 두 개 이상인 경우에 대한 정의를 제공해야합니다. 컴파일러는 이러한 경우를 지정하지 않으면 자동으로 수행 할 작업을 알지 못합니다.

do_something :: [(String, String, Int)] -> String 
do_something xs = case xs where 
    [(a, b, c)] -> func (a, b, c) ++ do_something (drop 1 [(a, b, c)]) 
    -- What about the other cases? 
    -- otherwise -> ??? 

또한,이 경우는대로 함수를 지정하는 것이 훨씬 좋을 것 :

그것을 보는 또 다른 방법은 함수 선언에서 그 패턴 매칭이 case 문을 사용하는 것과 동일하다

do_something (x:xs) = func x ++ do_something xs 
do_something [] = ??? 

이것은 실제로 함수를 재귀 적으로 정의합니다. 표현 drop 1 [(a, b, c)][]를 작성하는 것과 동일하므로 현재의 정의는 정확히 하나 개의 요소가 때를위한

그는 실제로 경우만을 준
do_something [(a, b, c)] = func (a, b, c) ++ do_something [] 
+0

에 해당 - 당신이 무슨 말을의 정확한 반대. –

+0

@DanielWagner 엎드려서, 내 머리에 "정의를 해줘야 해 ..." – bheklilr

+0

수정 사항으로, 당신은 내 upvote 있어요. =) –

관련 문제