1

まず、最初に String を受け取り、次に Int を取るタプルである Type StudentMark を作成しました。

type StudentMark = (String, Int)

これは私の capMarks 関数です:

capMarks :: [StudentMark] -> [StudentMark]
capMarks [cMarks] = [(st, mk) | (st, mk) <- [capMark cMarks]]

そして、ここに私の capMark 関数があります:

capMark :: StudentMark -> StudentMark
capMark (st, mk)
    |   mk > 39   =   (st, 40)
    |   mk < 40   =   (st, mk)

返されるはずです:

[("Jo", 37), ("Sam", 40)]

から:

capMarks [("Jo", 37), ("Sam", 76)]

ただし、関数にパラメーターを 1 つだけ入力した場合は、正しい期待される応答のみが返されます。次に例を示します。

capMarks [("Jake", 50)]

または

capMarks [("Jake"), 30]

しかし、想定どおりに 2 つ (またはそれ以上) を使用すると、capMarks 関数に非網羅的なパターンがあることがわかります。

4

2 に答える 2

1

Haskell でパターン マッチングがどのように機能するかを確認する必要があります。

capMarks [x]要素が 1 つのリストのみに一致します。おそらく必要なのはcapMarks myList = [ ... | ... <- f myList]、残りのケースを再帰的に定義するようなものです。

例えば

capMarks [] = []
capMarks x:xs = capMark x : capMarks xs

この簡略化された「バージョン」は抱擁で機能します

capMarks :: [Integer] -> [Integer]
capMarks xs = [(*) 2 x | x <- xs]
于 2016-01-22T18:14:41.403 に答える