St-6ren">
gpt4 book ai didi

haskell - Haskell的模式匹配中是否对 "List"进行了特殊处理?

转载 作者:行者123 更新时间:2023-12-02 04:59:04 26 4
gpt4 key购买 nike

我是 Haskell 的新手,希望这个问题并不愚蠢。

我见过很多例子,当我有一个列表时,我能够将列表的“组合元素”匹配并绑定(bind)到单个变量:

listSizeDesc :: [a] -> String
listSizeDesc [] = "Emtpy"
listSizeDesc (x:xs) = "Something inside"

但是,我尝试做类似的事情:

foo :: Int -> String
foo 0 = "Zero"
foo (n - 1) = "next number is " ++ show n

这不起作用。

在我看来, (n-1) 和 (x:xs) 都描述了如何“创建”参数并将“组件”绑定(bind)到参数。 List匹配的方式是不是专门为了方便递归而设计的?因为在我看来,这种匹配/参数绑定(bind)逻辑不适用于除 (:) 之外的其他函数。

最佳答案

您遇到的问题是模式匹配仅适用于数据构造函数。数据构造函数本质上非常简单;它只是获取数据值并将它们以某种结构分组在一起。例如,data Foo = Bar a b 只需获取两条数据并将它们分组到 Foo 标签下。您在第一个示例中使用的 (:) 函数不仅仅是一个函数;它是一个函数。它是一个数据构造函数。它通过将左侧参数添加到右侧参数来构造一个新列表。

现在,模式匹配只是执行与此过程相反的操作。它解构数据类型。当您在模式中编写 (x:xs) 时,您将提取构造函数最初缝合在一起的两部分数据。因此,所有模式匹配所做的就是提取构造函数先前拼接在一起的数据。

有一个异常(exception):n+k 模式。在 Haskell98 中,您可以使用 (n+k) 形式的模式。这是一种任意的异常(exception),最近被删除。如果您愿意,如果您包含 NPlusKPatterns 语言编译指示,您仍然可以使用它。

关于haskell - Haskell的模式匹配中是否对 "List"进行了特殊处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7992524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com