【发布时间】:2021-02-06 23:25:21
【问题描述】:
在学习 haskell 时,我无法理解 haskell 是如何自动匹配提取列表头部的模式的。
head' :: [a] -> a
head' [] = error "Can't find head in an Empty list!"
-- How does haskell break the list into x(first) and xs(rest)?
head' (x:xs) = x
我读过[1,2,3] 是1:2:3:[] 的语法糖。
那么: 是一个接受任何参数并添加到右手参数的函数?
列表如何向后分解为两个变量 head 和 rest?
[1,2,3] --> (x:xs)??
colon_operator :: a -> [a]
-- not sure how the function would look
对不起,如果我不能简明扼要地解释我的问题,我在 haskell 方面不是很擅长。
【问题讨论】:
-
您是否熟悉代数数据类型?如果是这样,快速的答案是
:不是普通函数而是列表构造函数;列表实际上定义为data [a] = (:) a [a] | []。 -
您的问题是关于编译器方面的如何 实现逻辑吗?或者关于语言是如何定义的?目前还不清楚是什么让您感到困惑……或者您是在看一般模式匹配的介绍吗?
-
@SukhinderpalMann 这是代数数据类型的定义。您可以在任何 Haskell 教程中了解有关它们的更多信息,例如learnyouahaskell.com/making-our-own-types-and-typeclasses。 (我应该注意,虽然我的定义在语法上不是有效的 Haskell,但仅作为示例:更好的版本是
data List a = Cons a (List a) | Nil。) -
[1,2,3]是1:2:3:[]的语法糖,实际上 是1:(2:(3:[])),即(x:xs),其中x = 1和xs = (2:(3:[]))。所以这里没有“落后”“爆炸”,也不存在解构。每个:都有两个 字段。就是这样。 -
让我为你找到一个链接......例如here's 我的回答带有链接和一些措辞。