isListEmpty ::((a -> Bool) -> [a] -> [a]) -> Bool
isListEmpty f | length f == 0 = True
| otherwise = False
関数の最初のパラメーターはisListEmpty
、名前を付けた関数でありf
、その型は関数であり、関数は署名付きの型を取り、 type を生成するため、これ(a -> Bool) -> [a] -> [a].
にフィードf
すると機能しません。length
length
[a]
Int
:t length
これは、ghci に移動して次のように入力することで確認できます[a] -> Int
。
最初に型を持つリストに f を適用すると、 andを使用して、それが空かどうかを確認[a]
できます。ただし、関数はリストが空かどうかをテストするための慣用的な方法であるため、代わりに使用することをお勧めします。length
==0
null
同様の関数を作成する方法の例を編集して追加します。
drop や init などの別の関数を実行した後、リストの長さを知りたいとしましょう。最初に、すべての引数を使用して完全に関数を記述します。
manipulateList :: ([a] -> [a]) -> [a] -> Int
manipulateList fn lst = length (fn lst)
length (fn lst)
関数合成でこれを書き直す代わりに(length.fn) lst
manipulateList :: ([a] -> [a]) -> [a] -> Int
manipulateList fn lst = (length.fn) lst
lst
これで、代数方程式の場合と同じように、両側の をキャンセルできます。
manipulateList :: ([a] -> [a]) -> Int
manipulateList fn = (length.fn)
これで、関数を取り、それに適用されたfn
後のリストの長さを見つける高階関数ができました。fn