2017-09-23 8 views
0

저는 haskell에서 합계 함수를 만들려고합니다. 언어에 익숙해지기 위해이 작업을하고 있습니다. 나는 그것을 다음과 같이 정의했다 :하스켈 - 어디에서 패턴 매칭을 이해 하시겠습니까?

mysum :: [Integer] -> Integer 
mysum lst = sm lst 
    where 
    sm :: [Integer] -> Integer 
    sm lst [] = 0 
    sm lst [x:xs]= 
     x + sm xs 

아이디어는 목록의 머리 부분의 값을 반환하고 꼬리를 함수에 다시 입력하는 것이었다. 나는 F #에서 비슷한 일을 회상하지만, 단순히 haskell에서 일하도록하지는 않습니다.

The error im getting is: 
sum.hs:5:5: error: 
    • Couldn't match expected type ‘Integer’ 
        with actual type ‘[[Integer]] -> Integer’ 
    • The equation(s) for ‘sm’ have two arguments, 
     but its type ‘[Integer] -> Integer’ has only one 
     In an equation for ‘mysum’: 
      mysum lst 
      = sm lst 
      where 
       sm :: [Integer] -> Integer 
       sm lst [] = 0 
       sm lst [x : xs] = x + sm xs 
    | 
5 |  sm lst [] = 0 
    |  ^^^^^^^^^^^^^... 

답변

7
sm :: [Integer] -> Integer 
    -- ^^^^^^^^^ one argument 
sm lst [] = ... 
-- ^^^ ^^ two arguments 
sm lst [x:xs]= ... 
-- ^^^ ^^^^^^ two arguments 

는 당신은 다른 인수에 lst을 제거하고 오직 패턴 일치해야합니다.

또한 (x:xs)은 대괄호를 사용하지 않습니다. [x:xs] 패턴은 요소가 비어 있지 않은 목록 x:xs 인 단일 요소 목록과 일치합니다. 목록 목록과 일치하지 않으려합니다.

가능한 수정 그러므로 : 중복이 위에있다

mysum :: [Integer] -> Integer 
mysum lst = sm lst 
    where 
    sm :: [Integer] -> Integer 
    sm [] = 0 
    sm (x : xs) = x + sm xs 

: mysumsm이 같은 일을! 따라서 우리는 보조 정의를 제거 할 수 있습니다.

mysum :: [Integer] -> Integer 
mysum []  = 0 
musum (x : xs) = x + mysum xs