1

このhaskellコードの場合:

isIn :: (Eq a) => [a] -> [a] -> Bool
needle `isIn` haystack = any (needle `isPrefixOf`) (tails haystack)

これは私が信じている関数の定義です。入力引数とリターンタイプを理解するにはどうすればよいですか?

例:何(Eq a)ですか?

4

1 に答える 1

3

Eqtypeclassと呼ばれるものです。それはいくつかの関数を宣言します。この場合は==友人であり、定義を提供するその型クラスのインスタンスを作成できます==

これは、型クラスのインスタンスである何かがある場合、それEqを使用できることを知っていることを意味し==ます。

ここでの秘訣は、私たちの関数には、それらが等しいことを確認できる型が必要だということです。実装が演算子[a] -> [a] -> Boolなしで機能することを約束しただけで、実際には機能しないため、問題が発生します。==

=>このため、関数定義にコンテキストを追加する を使用します。「型クラスのインスタンスであるa 限り、 これは機能します」のようなものです。そうすれば、安全に使用でき、すべての引数の型が適切に実装されていることがわかります。aEq==

クイックイラストレーション

これはエラーです:

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 []
于 2013-01-13T04:51:46.277 に答える