1

別の関数内で map や filter を使用すると、その関数は高階関数になりますか? 例えば:

removeSpaces :: String -> String 
removeSpaces xs = filter (not . isSpace) xs 

removeSpaces高階関数ですか?

4

4 に答える 4

6

いいえ、removeSpaces高階関数ではありません。

高階関数とは、引数として関数を取る関数です。removeSpacesそうではないので、そうではありません。

高次性は、関数の実装ではなく、関数のインターフェイスのプロパティであるためremoveSpaces、その型を見るだけで高次ではないことがわかります。引数として関数を取らないため、高次ではありません。高階関数を使って実装していますが、それは全く別問題です。

たとえばfilter、関数をパラメーターとして取ると宣言されているため、高階関数です。

filter :: (a -> Bool) -> [a] -> [a]

しかし、引数としてconcat関数型 ( ) がないため、そうではありません。a -> b

concat :: [[a]] -> [a]

ポリモーフィズムはトリッキーなエッジケースをもたらします: 関数を渡すことができますidid concat [[1, 2], [3, 4]]is [1, 2, 3, 4]— しかし、その型は引数として関数を受け取ることを宣言しません:

id :: a -> a

この場合、idは高次ではありません。関数の型を高次にするためには、関数の引数を明示的に持つ必要があります。

于 2012-02-07T22:27:48.917 に答える
3

いいえ。高階関数とは、別の関数をパラメーターとして受け取る関数です。

経験則: 型シグネチャの括弧内に矢印が含まれていて、これらの括弧が型シグネチャの末尾にない場合 (このように:(... -> ...) -> ...場合) 、関数は高階です。

于 2012-02-07T22:28:22.587 に答える
0

いいえ、高階関数は、たとえば、関数を引数として使用mapします。

于 2012-02-07T22:27:40.880 に答える
0

必ずしもそうではなく、あなたの例ではそうではありません。

高階関数は、関数をパラメーターとして受け取るか、結果として関数を返す関数です。

あなたのremoveSpaces関数はどちらも行いません。

于 2012-02-07T22:28:33.593 に答える