別の関数内で map や filter を使用すると、その関数は高階関数になりますか? 例えば:
removeSpaces :: String -> String
removeSpaces xs = filter (not . isSpace) xs
removeSpaces
高階関数ですか?
別の関数内で map や filter を使用すると、その関数は高階関数になりますか? 例えば:
removeSpaces :: String -> String
removeSpaces xs = filter (not . isSpace) xs
removeSpaces
高階関数ですか?
いいえ、removeSpaces
高階関数ではありません。
高階関数とは、引数として関数を取る関数です。removeSpaces
そうではないので、そうではありません。
高次性は、関数の実装ではなく、関数のインターフェイスのプロパティであるためremoveSpaces
、その型を見るだけで高次ではないことがわかります。引数として関数を取らないため、高次ではありません。高階関数を使って実装していますが、それは全く別問題です。
たとえばfilter
、関数をパラメーターとして取ると宣言されているため、高階関数です。
filter :: (a -> Bool) -> [a] -> [a]
しかし、引数としてconcat
関数型 ( ) がないため、そうではありません。a -> b
concat :: [[a]] -> [a]
ポリモーフィズムはトリッキーなエッジケースをもたらします: 関数を渡すことができますid
— id concat [[1, 2], [3, 4]]
is [1, 2, 3, 4]
— しかし、その型は引数として関数を受け取ることを宣言しません:
id :: a -> a
この場合、id
は高次ではありません。関数の型を高次にするためには、関数の引数を明示的に持つ必要があります。
いいえ。高階関数とは、別の関数をパラメーターとして受け取る関数です。
経験則: 型シグネチャの括弧内に矢印が含まれていて、これらの括弧が型シグネチャの末尾にない場合 (このように:(... -> ...) -> ...
の場合) 、関数は高階です。
いいえ、高階関数は、たとえば、関数を引数として使用map
します。
必ずしもそうではなく、あなたの例ではそうではありません。
高階関数は、関数をパラメーターとして受け取るか、結果として関数を返す関数です。
あなたのremoveSpaces
関数はどちらも行いません。