2013-05-13 2 views
2

내 코드입니다 :고차 함수, '|'입력에 대한 구문 분석 오류 여기

select_where_true :: (Double -> Bool) -> [Double] -> [Double] 
select_where_true is_neg [a] = case [a] of 
[] -> [] 
x:xs -> is_neg x 
      |(is_neg x) == False = [] 
      |(is_neg x) == True = x ++ (select_where_true is_neg xs) 


is_neg :: Double -> Bool 
is_neg x = x < 0 

그리고 여기에 오류 메시지입니다 :

[1 of 1] Compiling Main    (test.hs, interpreted) 

test.hs:5:18: parse error on input `|' 
Failed, modules loaded: none. 

사람이 내 코드에 문제가 있는지 말해 좋아?

나에게 좋은 조언을 해줄 수있는 사람에게 감사드립니다.

답변

7

당신이하려는 것 같습니다 takeWhile (또는 아마도 도청 filter) 다시 구현, 그래서 우리는 단순히

select_where_true :: (Double -> Bool) -> [Double] -> [Double] 
select_where_true = takeWhile 

을 설정할 수 있습니다 어쨌든, 코드 몇 가지 문제가있다. 당신이 case에서 가드에 대한 잘못된 구문을 사용하고 있기 때문에

  • 당신이있어 구문 오류입니다. 올바른 구문은 코드에서 입력 오류를 보여

    case ... of 
        pattern | guard -> ... 
          | ... -> ... 
    
  • 고정입니다. ++을 사용하여 요소를 앞에 추가하려고 시도하지만 ++두 개의 목록을 연결하여을 연결합니다. 요소를 앞에 붙이려면 대신 :을 사용하십시오. 그 고정으로 What is the difference between ++ and : in Haskell?

  • 를, 코드가 컴파일하지만 버그가 있습니다 :보기는 빈리스트에 실패하거나와 목록에 요소가 하나 이상 :

    > select_where_true is_neg [] 
    *** Exception: S.hs:(2,1)-(5,66): Non-exhaustive patterns in function select_where_true 
    
    > select_where_true is_neg [1,2] 
    *** Exception: S.hs:(2,1)-(5,66): Non-exhaustive patterns in function select_where_true 
    

    이 당신 때문입니다 실수로 여기에 패턴 매칭을하고 다시 '하는 것은 :

    select_where_true is_neg [a] = ... 
             ^^^ 
    

    에만 정확히 하나 개의 요소 목록과 일치하는 패턴이다. 모든 목록에 일치 시키려면 간단히 대괄호를 제거하십시오. case [a] of ...에서도 대괄호를 제거해야합니다.

    • 괄호의 대부분은 불필요 :이 모든 문제를 해결

    , 우리는 마지막으로, 어떤 스타일 제안

    select_where_true :: (Double -> Bool) -> [Double] -> [Double] 
    select_where_true is_neg a = case a of 
        [] -> [] 
        x:xs | (is_neg x) == False -> [] 
         | (is_neg x) == True -> x : (select_where_true is_neg xs) 
    

    와 끝까지. 함수 응용 프로그램은 모든 연산자보다 우선 순위가 높습니다.

  • expr == True 또는 expr == False을 쓰지 마십시오. 대신 expr 또는 not expr을 사용하십시오.
  • 가드가 모든 케이스를 담당하는 경우 마지막 케이스를 otherwise으로 바꿀 수 있습니다.
  • 가드가있는 사례 표현은 다소 어색합니다. 대신 여러 방정식을 작성하는 것이 더 쉽다 :

    select_where_true :: (Double -> Bool) -> [Double] -> [Double] 
    select_where_true is_neg [] = [] 
    select_where_true is_neg (x:xs) 
        | is_neg x = x : select_where_true is_neg xs 
        | otherwise = [] 
    
+0

들으 u는 너무 많이, 난 유 말한 다음 그것을 해결했습니다. – libra

2

경비원은 가지 않습니다. 대신에 case 문을 사용하십시오. case isNeg x of

1

에서 당신이처럼 쓸 수 있습니다 :

select_where_true :: (Double -> Bool) -> [Double] -> [Double] 
select_where_true is_neg [a] = case [a] of 
    []    -> [] 
    (x:xs) | is_neg x -> x ++ (select_where_true is_neg xs) 
    oterwise   -> [] 

우연히, 첫 번째 경우는 불가능하다; 그리고 두 번째로 (x:xs)=[a]x=a, xs=[]을 의미합니다. 아마도 괄호없이 select_where_true is_neg a = case a of ...을 의미했을 것입니다.