4

Intanと aの 2 つのパラメーターを持つ関数を作成する必要があります。この関数は、最初のパラメーターの出現箇所をすべて削除し[Int]て new を返します。[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ただし、すべての s は自然に比較可能であるため、この点がわかりません。これらのパラメーターを使用してメソッドを解釈および実装するにはどうすればよいですか? 私が言いたいのは、そもそもパラメータとは正確には何ですか?


@groovy @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]

ではない?


2013 年 2 月 7 日更新: 将来、同じ質問でこの投稿に出くわす可能性のあるすべての人のために、Haskell 全般に関するいくつかの良い情報と、特に私の質問をこのリンクで見つけました: http://learnyouahaskell .com/types-and-typeclasses

「興味深い。ここに新しいもの、=> シンボルがある。=> シンボルの前にあるものはすべてクラス制約と呼ばれる。前の型宣言は次のように読める: >等値関数は、これら 2 つの値の >type は、Eq クラスのメンバーでなければなりません (これはクラスの制約でした)。

Eq 型クラスは、等しいかどうかをテストするためのインターフェイスを提供します。その型の 2 つの値が等しいかどうかをテストすることが理にかなっている型はすべて、Eq クラスのメンバーにする必要があります。IO (入力と出力を処理するための型) と関数を除くすべての標準的な Haskell 型は、Eq 型クラスの一部です。」

4

2 に答える 2

16

パラメータを考える 1 つの方法は次のとおりです。

(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さんのコメントをもとに編集)

于 2013-02-05T06:22:11.593 に答える
6

あなたが実装したもの (むしろ、実装したと思うもの) は のリストでのみ機能する関数でありInteger、代入で求められているのは、すべての型のリストが同等に比較可能である場合に機能する関数を作成することです (したがって、関数は、ブール値または文字列のリストでも機能します)。おそらく多くを変更する必要はありません: コードから明示的な型シグネチャを削除して、コードghciから推測される型について質問してみてください (:l yourfile.hsそして:t deleteAll_list_comp)。算術演算または同様のものを使用しない限り、ほとんどの場合、関数は既にすべてのEq a.

概念を説明するより簡単な例として: 等価性をチェックする関数を書きたいとしましょうisequal(少し役に立たないかもしれませんが):

isequal :: Integer -> Integer -> Bool
isequal a b = (a == b)

これは の完全に優れた定義ですisequalが、手動で設定した型制約は必要以上に強力です。実際、手動の型シグネチャがない場合、ghci は次のように推論します。

Prelude> :t isequal
isequal :: Eq a => a -> a -> Bool

これは、関数が である限り、すべての入力タイプに対して機能することを示しています。これは、適切な関係が定義されているderiving Eqことを意味します。==


ただし、関数にはまだ問題があります。_rec関数と同じことを行う必要があるため_comp、型シグネチャが一致する必要があります。

于 2013-02-05T04:55:35.670 に答える