2012-01-10 5 views
1

우리는 목록 내포에 대한 조건을 결정하는 함수를 넣을 수 있습니까? 여기에 내가 구현하려고 내 코드입니다 :하스켈 (Haskell)의 목록 내포 함수에서 함수를 사용 하시겠습니까?

mQsort :: [String] -> [F.Record] -> [F.Record] 
mQsort [] _ = [] 
mQsort [email protected](col:cond:cs) [email protected](x:xs) = (mQsort c small) ++ mid ++ (mQsort c large) 
    where 
    small = [y | y<-xs, (qGetStr col y) (qGetCond cond) (qGetStr col x)] 
    mid = mQsort cs [y | y<-l, (qGetStr col y) == (qGetStr col x)] 
    large = [y | y<-xs, (qGetStr col y) (qGetCond' cond) (qGetStr col x)] 

qGetStr :: String -> F.Record -> String 
qGetStr col r | U.isClub col = F.club r 
      | U.isMap col = F.mapName r 
      | U.isTown col = F.nearestTown r 
      | U.isTerrain col = F.terrain r 
      | U.isGrade col =F.mapGrade r 
      | U.isSW col = F.gridRefOfSWCorner r 
      | U.isNE col = F.gridRefOfNECorner r 
      | U.isCompleted col = F.expectedCompletionDate r 
      | U.isSize col = F.sizeSqKm r 
      | otherwise = "" 

qGetCond "ascending" = (<) 
qGetCond "decending" = (>) 
qGetCond' "ascending" = (>) 
qGetCond' "decending" = (<) 

내가 함수 qGetStr 대신 또한 2
의 4 개 인자에 적용됩니다 없다는 오류를 얻을 qGetCond -이은을 반환 할 수있는 권리 구문입니다 운영자. 나는 때문에 컴파일 오류에 괄호 연산자를 배치했다,하지만 난 large에 대한 유사

small = [y | y<-xs, (qGetCond cond) (qGetStr col y) (qGetStr col x)] 

small = [y | y<-xs, (qGetStr col y) (qGetCond cond) (qGetStr col x)] 

교환이

+2

당신은 ['sortBy']에 관심이있을 수 있습니다 (http://hackage.haskell.org/packages/archive/base/latest/doc/ : 구문과 미묘한 몇 가지 있습니다 html/Data-List.html # v : sortBy). –

답변

8

잘못된 느낌이있다.

이유는 연산자를 qGetCond에 반환하는 데 사용하는 구문과 동일합니다. 연산자는 실제로 함수 일뿐입니다.

  • foo < bar(<) foo bar
  • foo `fire` bar과 동일합니다 그래서 당신은 당신의 지능형리스트의 표현의 시작에 "연산자"를 이동해야 같은

fire foo bar 같습니다. (N.B.이 일반적으로 사실이며, 특히 지능형리스트와는 아무 상관이 없습니다.)

편집 : 크리스 Kuklewicz의 지점 확장 :

  • 역 따옴표는 하나의 식별자를 해결. 따라서 foo `fire` bar은 유효한 구문이지만 foo `fire forcefully` bar 또는 foo `(fire forcefully)` bar과 같이 더 복잡한 것은 구문 오류입니다.

  • 괄호 안의 연산자는 더 유연합니다. 이 표현은 모두 같은 값으로 평가 :

    • foo < bar
    • (<) foo bar
    • (foo <) bar
    • (< bar) foo

    마지막 두 가지 형태 운영자 섹션이라고합니다. 함수를 다른 함수에 전달할 때 유용합니다. map (+1) listOfIntegers.

    (quux foo <)  -- function calls are fine 
    (baz + foo <)  -- syntax error because of the extra operator... 
    ((baz + foo) <) -- ...but this is ok 
    (-3)    -- `-` is a special case: this is a numeric literal, 
            --      not a function that subtracts three 
    (subtract 3)  -- is a function that subtracts three 
    
+3

백틱이 기호 대신 표현식에서 작동하면''(qGetStr col y)'(qGetCond cond)'(qGetStr col x)'가 유효했을 것입니다. 그러나 뒷받침 구문 설탕은 일반적이지 않습니다. –