1

文字列内の特定の文字をすべて削除する関数を作成しようとしていますが、私は Haskell のアマチュアであるため、眠れなくなる問題に遭遇しました。

これが私のコードです:

remove:: Char -> String -> Int
remove[] = []
remove (char : list) = char : remove (filter (\elm -> not (char == elm) ) list)

型定義を使用すると、次のエラー コードが表示されます。

ERROR "a5.hs":17 - Type error in explicitly typed binding
*** Term           : char : list
*** Type           : [a]
*** Does not match : Char

誰でも助けてもらえますか?

4

1 に答える 1

1

型シグネチャは、が aと aremoveの 2 つのパラメーターを取り、 を返すことを示しています。CharStringInt

Charエラー メッセージは、最初のパラメーター (a ) を(char : list)(a リスト)に一致させようとする 2 番目の方程式を参照しています。

おそらくあなたが意味した

remove char list = ...

?

その他のエラー:

  1. 最初の式は同じ間違いを犯しています (空のリストをパラメーターと一致させようとしていCharます)。

    おそらくこれは

    remove _ [] = ...
    

    (_何にでも合うという意味です。)

  2. 型シグネチャは、結果が であると述べてIntいますが、方程式はString結果を返します。

もっと間違いがあります。しかし、それはあなたを始めるでしょう。


編集:あなたの最初のコメントに応えて:

  1. 型シグネチャは

    remove :: Char -> String -> String
    

    removeCharaと aを受け取り、 aStringを返しますString

    を入れると、それは a を受け取り、 aを返すremove :: Char -> Stringことを意味します。removeCharString

  2. (\elm -> flip (==) elm)

    と同じです(\elm -> (==) elm)

    と同じです(\elm birch -> (==) elm birch)

    と同じです(\elm birch -> elm == birch)

    も同様(==)です。

    この式の型a -> a -> Boolは ですが、最初のパラメーターとして に渡していますfilter。これは、型を持つ関数を想定していますa -> Bool(つまり、2 つのパラメーターを受け取る関数ではなく、1 つのパラメーターを受け取る関数が必要です)。

    (これは、エラー メッセージが伝えていることです。)

于 2012-12-20T19:14:13.090 に答える