入力しようとしている関数があります。たとえば、次のようになります。
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]
コメントを追加