2012-02-08 12 views
0

次のコードを書いています。高次関数は、別の関数を取り込んで関数を結果として返す関数であることが分かります。しかし、関数が高次であるかどうかを明確に区別することはできません。 sortは高次関数ですか?関数が高次であるかどうかを調べるにはどうすればよいですか?Haskellの高次関数

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

高次関数は、関数を引数として取るか、関数(またはその両方)を返すことができます。あなたの関数は単に 'String'をとり、' String'のリストを返します。したがって、それは高次ではありません。しかし、ソート関数も(順序を決定するための比較演算子のような)関数を取った場合、それはより高次のものになります。 – birryree

+0

ハスケルでは、少なくとも2つの引数を持つすべての関数は別の関数を返します: 'a - > b - > c'は' a - >(b - > c) 'と同じです。これは関数の返り値が広すぎるため、高次関数を定義することを意味します。 '(+)'のようなものも含みます! –

+0

ええ、それは高次の定義です。ハスケルはかなり高次の機能を息絶え間なく生きています。 – 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"、books "carry"、 "table"、 "telephone" –

+0

@Sindu_ 'sortString'の入出力は高次関数ではありません。入力または出力のいずれも関数ではありません。それを行うためには、「それを高次関数にする」必要はありません。 – Ben

+0

@Sindu_ Haskellの['words'](http://www.haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:words)機能を見てください。 –

2

sortがconvertStringIntoListとxの入力を受け取った場合、それはより高次です。 xがconvertStringIntoListによって最初に処理され、次にソートされる場合、ソートは高次関数ではありません(関数はネストされています)。

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