1. ホーム
  2. haskell

[解決済み] 解釈の仕方 (Eq a)

2022-02-14 17:37:01

質問事項

2つのパラメータを持つ関数を作成する必要があります。 Int[Int] を返す、新しい [Int] を削除したものです。

リスト内包でもリスト再帰でも、簡単に関数を作ることができるんだ。しかし、私はこれらのパラメータでそれを行う。

deleteAll_list_comp :: Integer -> [Integer] -> [Integer]
deleteAll_list_rec :: (Integer -> Bool) -> [Integer] -> [Integer]

しかし、私の課題では、必要なパラメータは

deleteAll_list_comp :: (Eq a) => a -> [a] -> [a]
deleteAll_list_rec :: (Eq a) => a -> [a] -> [a]

この構文をどう読めばいいのかわからない。Googleが教えてくれたように (Eq a) は単にHaskellに次のように説明しているだけです。 a は比較可能な型です。しかし、これの意味がよくわからないのは、すべての Int は当然比較可能です。このパラメータを使ったメソッドの解釈や実装はどうすればいいのでしょうか?つまり、そもそもパラメータとは一体何なのでしょうか?


グルービー @pelotom

ありがとうございます、これでとても分かりやすくなりました。3つのパラメータを要求しているのに対して、実際には2つのパラメータを要求しているだけだということがわかりました。しかし、私はまだこのコードで問題に遭遇しています。

deleteAll_list_rec :: (Eq a) => a -> [a] -> [a]
delete_list_rec toDelete [] = []
delete_list_rec toDelete (a:as) =
        if(toDelete == a) then delete_list_rec toDelete as
        else a:(delete_list_rec toDelete as)

これによって、"の型署名が得られます。 deleteAll_list_rec には、バインディングが含まれていません。私の小さな経験では (a:as) はリストとしてカウントされ、そこから最初の要素が抽出されます。これはなぜエラーになるのですか?

deleteAll_list_comp :: (Eq a) => a -> [a] -> [a]
deleteAll_list_comp toDelete ls = [x | x <- ls, toDelete==x]

はないのですか?


2/7/13更新 将来、同じ質問でこの投稿に行き当たるかもしれない人たちのために、Haskell全般と私の質問に関する良い情報をこのリンクで見つけました。 http://learnyouahaskell.com/types-and-typeclasses

<ブロッククオート

面白いですね。ここでは新しいもの、=>記号を見ることができます。記号の前はすべて、クラス制約と呼ばれます。等号関数は、同じ型の任意の2つの値を受け取り、Boolを返します。その2つの値の>型は、Eqクラスのメンバでなければなりません(これがクラス制約でした)。

Eq 型クラスは、等質性をテストするためのインタフェースを提供する。その型の2つの値間の等質性をテストすることが意味を持つすべての型は、Eq >クラスのメンバであるべきです。IO(入力と出力を扱う型)と関数を除くすべての標準的な Haskell の型は、Eq 型クラスの一部です。

どのように解決するのですか?

パラメータを考える一つの方法として、以下のようなものが考えられます。

(Eq a) => a -> [a] -> [a]

(Eq a) =>   means any a's in the function parameters should be members of the 
            class Eq, which can be evaluated as equal or unequal.*

a -> [a]    means the function will have two parameters: (1) an element of
            type a, and (2) a list of elements of the same type a (we know that 
            type a in this case should be a member of class Eq, such as Num or 
            String).

-> [a]      means the function will return a list of elements of the same 
            type a; and the assignment states that this returned list should 
            exclude any elements that equal the first function parameter, 
            toDelete.

(* pelotomのコメントに基づいて編集)