2012-02-08 5 views
0

다음 코드를 작성했습니다. 고차 함수는 다른 함수를 취하여 결과로 함수를 반환하는 함수라는 것을 알고 있습니다. 하지만 기능이 고 순서인지 여부를 명확하게 구분할 수는 없습니다. sort은 고차 함수입니까? 기능이 더 높은 순서인지 아닌지 어떻게 알 수 있습니까?하스켈의 고차 함수

sortString :: String -> [String] 
sortString x = sort (convertStringIntoList x) 
+0

높은 차수 기능은 인수로 함수를 사용하거나 함수 (또는 둘 다)를 반환 할 수 있습니다. 당신의 함수는 단지'String'을 받아서'String'의리스트를 반환하기 때문에 더 높은 순서가 아닙니다. 그러나 정렬 함수가 (순서를 결정하기 위해 비교 연산자와 같은) 함수를 취한 경우에는 더 높은 순서가됩니다. – birryree

+0

하스켈에서 적어도 두 개의 인수를 가진 모든 함수는 또 다른 함수를 반환합니다 :'a -> b -> c'는'a -> (b -> c)'와 같습니다. 이것은 함수를 반환하는 것이 너무 광범위하기 때문에 고차 함수를 정의하는 것을 의미합니다 -'(+)'같은 것을 포함하게됩니다! –

+0

그래,하지만 그건 고차원의 정의 야. Haskell은 고차원 기능을 거의 살아 숨 쉬고 있습니다. – birryree

답변

6

상위 함수는 다른 함수를 인수로 사용하거나 다른 함수를 결과로 생성하는 함수 또는 두 가지 모두입니다.

질문에있는 함수는 함수가 아닌 문자열 인 단일 인수를가집니다. 함수가 적용되면 함수 ’의 값은 문자열이 아니라 함수의 배열입니다. 따라서 일반적인 기능입니다.

고차 있음 유사한 기능

sortString :: (Char -> Char -> Ordering) -> String -> [String] 
sortString cmp s = map (:[]) $ sortBy cmp s 

고차 함수의 능력들이 제공하는 유연성이다. 다른 기능을 제공하는 것은 다른 결과 생산 : 당신이 ’톤 잘 알고 때로 믿을 경우

ghci> sortString compare "slkdjfs" 
["d","f","j","k","l","s","s"] 

ghci> sortString (flip compare) "slkdjfs" 
["s","s","l","k","j","f","d"] 

compare는 인수, 예에 Ordering 기준을 제공합니다, 당신이다시피

ghci> compare 'a' 'b' 
LT 
ghci> compare 'b' 'a' 
GT 

flip 자체 재정렬하거나 다른 함수에 인수를 뒤집 다른 고차 함수입니다. 위의 코드에서와 같이 flip을 사용하면 오름차순이 아닌 내림차순으로 목록을 정렬 할 수 있습니다.

+0

sortString을 더 높은 차수의 함수로 만들고 다음과 같은 입력과 출력을 얻을 수 있습니까? 입력 : "books to book"출력 : [books ","carrying ","table ","telephone "] –

+0

@Sindu_ 'sortString'의 입출력은 고차 함수가 아닙니다. 입력이나 출력은 함수가 아닙니다. 그렇게하기 위해 "고차원 함수로 만들 필요"는 없습니다. – Ben

+0

@Sindu_ 하스켈의 ['words'] (http://www.haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:words) 기능을 살펴보십시오. –

2

sort가 convertStringIntoList 및 x 입력을받는 경우, 더 높은 순서입니다. x가 convertStringIntoList에 의해 처음 작동되면 sort에 의해 정렬이 고차 함수가 아닙니다 (함수는 중첩됩니다).

sort (http://zvon.org/other/haskell/Outputlist/sort_f.html)의 입력 및 출력 유형을 기반으로하면 처음이라고 말하고 싶습니다. (형식화 방식에 따라이 경우가되어야합니다.) 형식 정의 Ord a => [a] -> [a]는 함수가 "a"의 목록을 받아서 "a", 여기서 a는 "Ord"클래스의 유형입니다. 기본적으로 이는 Char, Double, Float, Int 또는 Integer 일 수 있음을 의미합니다 (http://zvon.org/other/haskell/Outputprelude/Ord_c.html). 따라서 입력은 함수가 될 수 없습니다.

일반적으로 입력 및 출력 유형을 조회하여 함수의 순서가 더 높은지 확인할 수 있습니다. 이들 중 하나가 함수가 될 수 있으면 함수는 더 높은 차수 함수가 될 수 있습니다.

입력이 기능 일 수도 있고 아닐 수도있는 경우 약간의 회색 영역이있을 수 있습니다. 예를 들어, 입력을 가져 와서 동일한 출력을 반환 한 함수가 있다고 가정 해보십시오 (무의미하지만 단지 예일뿐입니다). 그렇다면 내가 입력으로 문자를 사용했다면 더 높은 차수 기능으로 작동하지 않을 것입니다,하지만 당신이 입력으로 함수를 사용했다면 말입니다. 그 부분에 대해 확실하지 않은, 그냥 내 직감.

+0

또한 sortString은 입력 또는 출력이 함수가 아니기 때문에 확실히 더 높은 차수 함수가 아닙니다. – Bridget