2016-04-14 15 views
0

私はクラスでハスケルを学んでいましたので、リストから何かのインスタンスをすべて削除するという問題がありました。これは私の行くことですが、私はこのエラーにぶつかり、私は私が従うことを確信していません。ハスケル:実際のタイプと予想されるタイプを一致させることができませんでした

--delete element from list 
removeElement :: [a] -> [a] 
removeElement x [] = [] 
removeElement x aList = 
    if (head aList) == x 
     then removeElement x (tail aList) 
     else aList 

私が受け取るエラーは、このです:

Couldn't match expected type `[[a]] -> [[a]]' 
       with actual type `[a]' 
    Relevant bindings include 
     removeElement :: [a] -> [a] (bound at hwmk3.hs:8:1) 
    The equation(s) for `removeElement' have two arguments, 
    but its type `[a] -> [a]' has only one 

私は、構文が間違っていると推測しているが、私はそれを修正するかどうかはわかりません。ご協力いただきありがとうございます。

+1

シグネチャには、あなたの関数には1つの引数があり、式には2つあります。心配していますが、これはハスケルでセンスがあります。ここで必要なのはおそらくないでしょう。 –

答えて

5

いくつかのこと:実装はあなたが単一の要素である最初のものの2つのパラメータを、受信する必要があることを示し、一方、

あなたの型注釈は、あなたの関数は、単一のリストのパラメータを受け取り、リストを返すことを示しています。

さらに、==を使用して比較しているため、タイプがEqの型クラスであることを確認する必要があります。

あなたの型注釈は、おそらく次のようになります。

removeElement :: Eq a => a -> [a] -> [a] 

ます。また、パターンマッチングを利用することによって物事を単純化することができます。

removeElement x [email protected](y:ys) = 
    if y == x 
    then removeElement x ys 
    else aList 

しかし、あなたの条件文の論理エラーがあります:あなたはこのようなあなたの関数を定義する場合は、headtailを使用する必要はありません。これは宿題のように聞こえるので、私は答えを見つけるためにそれをあなたに任せます。ヒントを試してみてくださいremoveElement 3 [1, 2, 3]

+0

ああ、それは私が行っていた機能のほんの一部です。私は構文を知らないだけでした。ありがとうございました!これは多くの助けとなりました。 –

0

あなたの機能は、あなたがそれを行うだろうと思う何をしないようにあなたの型シグネチャが

removeElement :: a -> [a] -> [a] 

する必要があります。また、それが見えます。

1

あなたの関数の明示的な型宣言を省略した場合、Haskellはa -> [a] -> [a]のようなものを推測するでしょう。実際には、はまだであることを推測しています。そのため、あなたの記載されたタイプと一致しないと訴えています。

ハスケルによって報告された問題はこれです。

removeElement x = \aList -> if (head aList) == x then removeElement x (tail aList) else aList 

にdesugarsあなたの第2式を見るといくつかのことは "明白" です:removeElementの引数として

  1. x :: [a]
  2. ラムダ式は、一部のタイプがtおよびvの場合、タイプがt -> vです。

しかし、我々はすでにremoveElement :: [a] -> [a]が、私たちはtの値を考え出すことができることを言ったと[a] ~ t -> vようv?多分。推論型を推測しましょう。

tは、head aList == xから[[a]]と推測できるタイプのaListです。再帰呼び出しをスキップすると、aListが戻り値であることがわかるので、v[[a]]です。したがって、t -> vは実際には[[a]] -> [[a]]です。

タイプ[[a]] -> [[a]]の値を[a]と一致させることはできますか?

いいえ、あなたが行った正確なエラーメッセージが表示されます。

関連する問題