2013-04-19 3 views
1

안녕하세요 저는 하스켈 초보자이며 정말 실종입니다. 이 내 과제에 대한, 그리고 그것을 higer 주문 기능을 모두더 높은 차수 함수를 사용하여 매개 변수로 haskell 정렬하기

Main> mySort (<) [1,5,3,6,4,1,3,3,2] 
[1,1,2,3,3,3,4,5,6] 
Main> mySort (>) [1,5,3,6,4,1,3,3,2] 
[6,5,4,3,3,3,2,1,1] 
Main> mySort longerWord [“Hello”, “The”, “a”, “Daniel”, “Declarative”] 
[“Declarative”, “Daniel”, “Hello”, “The”, “a”] 

첫째을 사용하여 아래와 같이 뭔가를 나에게 묻는다, 나는 그것이 <,> 또는 longerWord

여부를 구별하는 기능을해야한다고 생각

checkConditionStr::String->Int 
checkConditionStr str 
    |str=="(<)" =1 
    |str=="(>)" =2 
    |str=="longerWord" =3 
하지만 예는 따옴표가없는 (즉, mysort (<) 나의 종류 "(<)은"그래서 여기에 다른 longerWord

입니다. 내 첫 번째 문제는. 나는이 기능을 worte하지만 컴파일되지 것입니다
checkCondition::Ordering->Int 
checkCondition ord 
    |ord==(<) =1 
    |ord==(>) =2 
    |otherwise =2 

둘째로 고차 함수를 이해하는 데 여전히 어려움이 있습니다. 이게 말이 되겠습니까?

mySort::(String->Int)->[a]->[a] 
mySort i list 
    |i==1 map (sortBy compare) list 
    |i==2 map (sortBy(flip compare)) list 

답변

5

이러한 기능과 구체적으로 일치하지 않아도됩니다. 처음에는 고차 함수를 사용하는 목적을 상실합니다. 실제로 함수를 비교하는 일반적인 방법이 없으므로 이렇게 작성할 수는 없습니다.

대신 전달 된 함수를 정렬에 사용하십시오. 그렇게하면 명시 적으로 코드를 작성한 함수뿐만 아니라 모든 적절한 비교 함수에서 작동합니다.

combine (+) 2 3 = 5 
combine (*) 3 5 = 15 
combine max 10 100 = 100 

당신은 이런 식으로 그것을 해결할 :

combine op x y = x `op` y 

당신이 해결 유사한 접근 방식을 사용할 수 예를 들어

는 작업을 상상하는 것은 통과 연산자를 사용하여 두 값을 결합했다 정렬 문제?

힌트 : 당신은 sortBy에 적합한 형태로 전달 된 비교 함수를 변환하는 도우미 함수를 정의 할 수 있습니다 :

compareUsing :: (a -> a -> Bool) -> (a -> a -> Ordering) 
compareUsing op x y = ... 
내가 기능을 비교하는 상위의 전체 아이디어 이후 쓸모가 있다고 말하고 싶지만
+0

기능은 미래에 알려질 수있는 것을 주입하기 위해 열어 두는 것입니다. – ony

+0

당신은 내가 말한 것을 이해하지 못했거나 당신이 말하는 것을 이해하지 못했습니다. 이 경우 고차 함수는 함수 집합으로 제한되기 때문에 myHighOrder f = if f == (<) then ... '은 이해가되지 않는다고 말하려고합니다. 따라서 직접 작성 될 수 있습니다. 일반적인 고차 함수는 실제로 몇 가지 제약 조건을 만족하는 함수로 매개 변수화 할 수있는 개방형 함수 계열입니다. – ony

+0

@ony : 정확히 말하면, 또는 내 대답에서 말하려고하는 것입니다. – hammar