Haskell関数のタイプを一致させることができません

Callum McKinnon-Snell

入力しようとしている関数があります。たとえば、次のようになります。

look codeIndex 4719

codeIndexは次のようにDatabase保存されます[(Int, String, Int)]

描画元のインデックスとコード値が指定された関数は、リスト内のその要素の末尾(String、Int)を返すという考え方です。

look :: Database -> BarCode -> BillItem
 look [] y = ("Unknown Item", 0)
 look (a,b,c:xs) y
       | y == a                = (b,c)
       | otherwise             = ("Unknown Item", 0)

私は最初に試しました

look (x:xs) y
    | y == head x                = tail x

しかし、それはうまくいきませんでした。私はHaskellに非常に慣れていないので、これで終わりがないので混乱します。

ダニエル・マーティン

したがって、あなたが言及する「元の」アプローチはおそらくより良い考えだと思いますが、最初にパターンマッチエラーを邪魔にならないようにしましょう。

look :: Database -> BarCode -> BillItem
look [] y = ("Unknown Item", 0)
look ((a,b,c):xs) y
      | y == a                = (b,c)
      | otherwise             = ("Unknown Item", 0)

つまり、(a,b,c:xs)あなたが言ったとき、あなたが言っていたのはと同じでした(a,b,(c:xs))あなたはそれを望まないので、あなたは周りの親が必要(a,b,c)です。さて、それが修正されると、コンパイルされます!

しかし、待ってください("Unknown Item", 0)。データベースの最初のものを除いて、すべてが返されます。最初のものだけを見るように指示したかのようで、それが一致しない場合はエラーを返します。

ああ、待って、あなたは持っています。コードのすぐそこに、「空でないデータベースがある場合は、最初の項目と一致するかどうかを確認して返します。そうでない場合は、エラーを返します」と表示されます。

それでは、それを修正しましょう。最初の項目が一致しない場合は、エラー値を返さずに、データベースの残りの部分を試す必要があります。

look :: Database -> BarCode -> BillItem
look [] _ = ("Unknown Item", 0)
look ((a,b,c):xs) y
       | y == a                = (b,c)
       | otherwise             = look xs y

そして実際、それは機能します:

type Database = [(Int, String, Int)]
type BillItem = (String, Int)
type BarCode = Int

look :: Database -> BarCode -> BillItem
look [] _ = ("Unknown Item", 0)
look ((a,b,c):xs) y
       | y == a                = (b,c)
       | otherwise             = look xs y

main = do
  let db = [(111, "Item One", 1),
            (222, "Item Two", 2),
            (333, "Item Three", 3),
            (444, "Item Four", 4),
            (555, "Item Five", 5),
            (666, "The Beast", 6),
            (777, "Item Seven", 7)]
  print $ look db 777
  print $ look db 111
  print $ look db 123

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Haskell:タイプ `[Char] 'と` Char'を一致させることができませんでした

分類Dev

Haskell-タイプ「PersistEntityBackendrecord0」を「SqlBackend」と一致させることができませんでした

分類Dev

Haskell-タイプ `(Int、Integer) 'を` Pos'と一致させることができませんでした

分類Dev

Haskellはタイプ `[] 'を` IO'と一致させることができませんでした

分類Dev

Haskell-タイプ[]をIOと一致させることができませんでした

分類Dev

Haskell:エラー:タイプ「[]」を「IO」と一致させることができませんでした

分類Dev

Haskell:タイプを一致させることができませんでしたか?

分類Dev

Haskell readFile:期待されるタイプ '[String]'を実際のタイプ 'IOString'と一致させることができませんでした

分類Dev

Haskell:期待されるタイプ「a1」を実際のタイプ「a」と一致させることができませんでした

分類Dev

Haskellは期待されるタイプ「ItemNat」を実際のタイプ「()」と一致させることができませんでした

分類Dev

haskellは期待されるタイプを実際のタイプ 'Bool'と一致させることができませんでした

分類Dev

Haskell '期待されるタイプと実際のタイプを一致させることができませんでした'

分類Dev

haskellでクラスタイプを特定のタイプと一致させることができません

分類Dev

UNIONタイプのテキストとbigintを一致させることができません

分類Dev

Haskell、Control.Lens:タイプ「[Language.Haskell.TH.Syntax.Dec]」を「Language.Haskell.TH.Syntax.Exp」と一致させることができませんでした

分類Dev

Haskell、Control.Lens:タイプ「[Language.Haskell.TH.Syntax.Dec]」を「Language.Haskell.TH.Syntax.Exp」と一致させることができませんでした

分類Dev

Haskell:関数folde:期待される型「a」を実際の型「Expr」と一致させることができませんでした

分類Dev

Haskellは期待されるタイプ 'Bool'をタイプ[t0]に一致させることができません

分類Dev

Haskellタイプエラー「タイプ `Char 'と` t0 [Char]'を一致させることができませんでした」

分類Dev

c ++:関数定義を既存の宣言と一致させることができません

分類Dev

VS2015 C ++:関数定義を既存の宣言と一致させることができません

分類Dev

Haskell関数の予想されるタイプと一致しませんでした

分類Dev

タイプ「[Char]」を「Data.Text.Internal.Text」と一致させることができませんでした

分類Dev

タイプ「EitherString」を「[]」と一致させることができませんでした

分類Dev

タイプ `[Char] 'と` Value'を一致させることができませんでした

分類Dev

タイプ「a」と「b」を一致させることができませんでした

分類Dev

タイプ `a`と` a1`を一致させることができませんでした

分類Dev

エラー:CASEタイプの文字が異なり、数値を一致させることができません

分類Dev

haskell-タイプ '(Char、Int)'と '[Char]'エラーを一致させることができませんでした

Related 関連記事

  1. 1

    Haskell:タイプ `[Char] 'と` Char'を一致させることができませんでした

  2. 2

    Haskell-タイプ「PersistEntityBackendrecord0」を「SqlBackend」と一致させることができませんでした

  3. 3

    Haskell-タイプ `(Int、Integer) 'を` Pos'と一致させることができませんでした

  4. 4

    Haskellはタイプ `[] 'を` IO'と一致させることができませんでした

  5. 5

    Haskell-タイプ[]をIOと一致させることができませんでした

  6. 6

    Haskell:エラー:タイプ「[]」を「IO」と一致させることができませんでした

  7. 7

    Haskell:タイプを一致させることができませんでしたか?

  8. 8

    Haskell readFile:期待されるタイプ '[String]'を実際のタイプ 'IOString'と一致させることができませんでした

  9. 9

    Haskell:期待されるタイプ「a1」を実際のタイプ「a」と一致させることができませんでした

  10. 10

    Haskellは期待されるタイプ「ItemNat」を実際のタイプ「()」と一致させることができませんでした

  11. 11

    haskellは期待されるタイプを実際のタイプ 'Bool'と一致させることができませんでした

  12. 12

    Haskell '期待されるタイプと実際のタイプを一致させることができませんでした'

  13. 13

    haskellでクラスタイプを特定のタイプと一致させることができません

  14. 14

    UNIONタイプのテキストとbigintを一致させることができません

  15. 15

    Haskell、Control.Lens:タイプ「[Language.Haskell.TH.Syntax.Dec]」を「Language.Haskell.TH.Syntax.Exp」と一致させることができませんでした

  16. 16

    Haskell、Control.Lens:タイプ「[Language.Haskell.TH.Syntax.Dec]」を「Language.Haskell.TH.Syntax.Exp」と一致させることができませんでした

  17. 17

    Haskell:関数folde:期待される型「a」を実際の型「Expr」と一致させることができませんでした

  18. 18

    Haskellは期待されるタイプ 'Bool'をタイプ[t0]に一致させることができません

  19. 19

    Haskellタイプエラー「タイプ `Char 'と` t0 [Char]'を一致させることができませんでした」

  20. 20

    c ++:関数定義を既存の宣言と一致させることができません

  21. 21

    VS2015 C ++:関数定義を既存の宣言と一致させることができません

  22. 22

    Haskell関数の予想されるタイプと一致しませんでした

  23. 23

    タイプ「[Char]」を「Data.Text.Internal.Text」と一致させることができませんでした

  24. 24

    タイプ「EitherString」を「[]」と一致させることができませんでした

  25. 25

    タイプ `[Char] 'と` Value'を一致させることができませんでした

  26. 26

    タイプ「a」と「b」を一致させることができませんでした

  27. 27

    タイプ `a`と` a1`を一致させることができませんでした

  28. 28

    エラー:CASEタイプの文字が異なり、数値を一致させることができません

  29. 29

    haskell-タイプ '(Char、Int)'と '[Char]'エラーを一致させることができませんでした

ホットタグ

アーカイブ