在我看来,像[](空列表)和无/没有什么是如此相似。 我想知道这个语言系列中是否有任何一种基本列表类型,其中每个元素都是一个选项,尾部守卫是什么?
是不是这样(在具有不同类型的语言中这样做),因为它会使模式匹配列表过于冗长?
答案 0 :(得分:5)
你在Lisp中有类似的东西,nil
用于表示缺少可选值和空列表。你可以在Haskell中做这样的事情(我假设大多数类似ML的语言),
newtype MyList a = MyList (Maybe (a, MyList a))
但它更冗长,并且与使用自己的数据类型相比没有任何明显的好处。
答案 1 :(得分:4)
Nothing
必须同时具有Maybe a
和[] a
类型。
可以使用Maybe
上的固定点类型构建类似的东西(但不幸的是,在实践中使用过于笨拙IMO):
-- 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)
这是 isomorphic 你要求的东西,但是对接的痛苦。我们可以轻松地制定一个缺点:
In (O (Just (1, In (O (Just (2, In (O Nothing)))))))
In
和O
是“身份构造函数” - 它们仅用于指导类型检查,因此您可以在心理上删除它们并获得所需内容。但是,遗憾的是,你无法将它们移除。
我们可以轻松制作cons
功能。模式匹配我们不是那么幸运。我不能代表其他ML家庭语言,但IIRC他们甚至不能代表像Mu
这样的高等语种。