このhaskellコードの場合:
isIn :: (Eq a) => [a] -> [a] -> Bool
needle `isIn` haystack = any (needle `isPrefixOf`) (tails haystack)
これは私が信じている関数の定義です。入力引数とリターンタイプを理解するにはどうすればよいですか?
例:何(Eq a)
ですか?
このhaskellコードの場合:
isIn :: (Eq a) => [a] -> [a] -> Bool
needle `isIn` haystack = any (needle `isPrefixOf`) (tails haystack)
これは私が信じている関数の定義です。入力引数とリターンタイプを理解するにはどうすればよいですか?
例:何(Eq a)
ですか?
Eq
typeclassと呼ばれるものです。それはいくつかの関数を宣言します。この場合は==
友人であり、定義を提供するその型クラスのインスタンスを作成できます==
。
これは、型クラスのインスタンスである何かがある場合、それEq
を使用できることを知っていることを意味し==
ます。
ここでの秘訣は、私たちの関数には、それらが等しいことを確認できる型が必要だということです。実装が演算子[a] -> [a] -> Bool
なしで機能することを約束しただけで、実際には機能しないため、問題が発生します。==
=>
このため、関数定義にコンテキストを追加する を使用します。「型クラスのインスタンスであるa
限り、 これは機能します」のようなものです。そうすれば、安全に使用でき、すべての引数の型が適切に実装されていることがわかります。a
Eq
==
クイックイラストレーション
これはエラーです:
doIfEqual :: a -> a -> (a -> a -> [a])
doIfEqual a b f = if a==b then f a b else []
a
がのインスタンスであることを指定しているため、これは機能しますEq
doIfEqual (Eq a) => a -> a -> (a -> a -> [a])
doIfEqual a b f = if a==b then f a b else []