模式匹配以迭代列表

时间:2012-05-15 22:23:47

标签: list haskell logic

我正在尝试从Haskell Road to Logic学习Haskell 并且遇到了这个例子:

    mnmInt :: [Int] -> Int
    mnmInt [] = error "empty list"·
    mnmInt [x] = x
    mnmInt (x:xs) = min x (mnmInt xs)

我理解这些函数会列出Int - 检查是否为空 如果不 检查它是否是带有1 int的列表,如果返回x则返回x 如果不 使用xs参数将mnmInt插入min。

它是如何达到基本情况的? xs代表什么?

min implementation:

   min' :: Int -> Int -> Int
   min' x y | x <= y    = x
            | otherwise = y

不接受数组。

2 个答案:

答案 0 :(得分:5)

(x:xs)是模式匹配语法。模式匹配允许您“解构”数据类型并将它们绑定到名称。在这种情况下,x是列表的头部,xs是尾部。 min'不需要列表,因为x是列表的头部,而不是列表本身。

min'本身会找到两个Ints之间的最小值,mnmInt如果传入的列表看起来像{{1},最终会扩展到(min' 1 (min' 2 (min' 3 4)))之类的值}}

如果您手动评估代码,很容易看到,我强烈建议您尝试。请记住,[1,2,3,4]是两个名称,它们是列表的头部和尾部。您可能想要使用(x:xs)

来构建列表

这是一个示例,显示模式匹配如何与代码流相关。

:

如果你致电foo (x:y:[]) = "two" foo ([]) = "none" foo (_) = "some other value" 它会输出“2”,如果你foo [1,2]它会给你“其他一些价值”,如果你foo [1,2,3]它会返回{{} 1}}

答案 1 :(得分:1)

你可以在Haskell中以两种方式编写一个列表,首先是[1,2,3,4,5],它只是1:2:3:4:5:[]的语法糖。 现在模式(x:xs)与这样的列表匹配:

    head(x:xs) = x
    --> head [1,2,3,4,5] = head 1:2:3:4:5:[] = head 1:xs = 1

我希望这个例子能清楚地告诉你列表模式是如何工作的。