在我看来,[](空列表)和 None/Nothing 是如此相似。我想知道该语言家族中是否有任何一种具有基本列表类型,其中每个元素都是一个选项,而尾部保护是空的?
是不是(在具有不同类型的语言中没有这样做)因为它会使模式匹配列表过于冗长?
在我看来,[](空列表)和 None/Nothing 是如此相似。我想知道该语言家族中是否有任何一种具有基本列表类型,其中每个元素都是一个选项,而尾部保护是空的?
是不是(在具有不同类型的语言中没有这样做)因为它会使模式匹配列表过于冗长?
您在 Lisp 中有类似的东西,其中nil
既用于表示不存在可选值又表示空列表。你可以在 Haskell 中做这样的事情(我假设大多数类似 ML 的语言),
newtype MyList a = MyList (Maybe (a, MyList a))
但它更冗长,并且与使用自己的数据类型相比没有任何明显的好处。
嗯,我不知道。对于构成这些语言类型系统的基础的 Hindley-Milner 类型系统来说,这将是困难的。(在 Haskell 命名法中)Nothing
必须同时具有Maybe a
类型[] a
。
类似的东西(但不幸的是在 IMO 实践中使用太笨拙)可以使用定点类型构建Maybe
:
-- fixed point
newtype Mu f = In (f (Mu f))
-- functor composition
newtype (f :. g) a = O (f (g a))
type List a = Mu (Maybe :. (,) a)
这与您所要求的同构,但令人头疼。我们可以很容易地创建一个 cons 函数:
In (O (Just (1, In (O (Just (2, In (O Nothing)))))))
In
并且O
是“身份构造函数”——它们的存在只是为了指导类型检查,所以你可以在精神上删除它们,你就会得到你想要的。但是,不幸的是,您无法从物理上移除它们。
我们可以cons
很容易地制作一个函数。我们在模式匹配方面并不那么幸运。我不能代表其他 ML 家族语言,但 IIRC 他们甚至不能代表更高种类的类型,例如Mu
.