Int
anと 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 型クラスの一部です。」