我该如何解决这个 Haskell 模式匹配练习?

How can I solve this Haskell pattern matching exercise?

我不太明白在这个 Haskell 练习中我必须做什么。谁能帮我解决一下?

关于复杂的模式匹配:

给出表达式 x0、x1 和 x2,其函数 f returns 分别为 0、1 和 2。即,给出 x0、x1 和 x2 的一些定义,使得 f x0 == 0、f x1 == 1 和 f x2 == 2。

这里是函数的定义f:

f :: [[(a, [b])]] -> Int
f [(x, xs): [y, ys]] = 0
f ([_]: [(x, [xs])]: [y, ys]: []) = 1
f ([(x, y: _: [])]: []) = 2

出于测试目的,必须计算这 3 个表达式:

f x0 == 0
f x1 == 1
f x2 == 2

你应该这样写:

x0 = [ ... your answer here ... ]
x1 = [ ... your answer here ... ]
x2 = [ ... your answer here ... ]
putStrLn $ "f x0 = " <> show (f x0)
putStrLn $ "f x1 = " <> show (f x1)
putStrLn $ "f x2 = " <> show (f x2)

重点是证明您可以阅读您引用的 f 定义中的模式并找到适合的值。

一些提示:

  • f的类型。每个答案应该是成对列表的列表,其中每对由一个值和一个列表组成。因此,正确类型的值(但不是您想要的答案)可能是 [[(1,[56,64,23]), (2, [78])], []]。这是一个包含两个子列表的列表。第一个有两个值,第二个有 none.

  • 我在示例中使用了整数,但您可以使用任何其他类型。

  • 第一个问题使用 : 后跟一个包含两个元素的列表。这意味着答案将包含 3 个元素。并且 3 元素列表将成为外部列表(列表的列表,记住)中的唯一项。