是否有类似ml的语言(标准ml / ocaml / f#/ haskell / etc),其中列表元素是选项类型

时间:2011-07-09 11:51:52

标签: list haskell functional-programming null ml

在我看来,像[](空列表)和无/没有什么是如此相似。 我想知道这个语言系列中是否有任何一种基本列表类型,其中每个元素都是一个选项,尾部守卫是什么?

是不是这样(在具有不同类型的语言中这样做),因为它会使模式匹配列表过于冗长?

2 个答案:

答案 0 :(得分:5)

你在Lisp中有类似的东西,nil用于表示缺少可选值和空列表。你可以在Haskell中做这样的事情(我假设大多数类似ML的语言),

newtype MyList a = MyList (Maybe (a, MyList a))

但它更冗长,并且与使用自己的数据类型相比没有任何明显的好处。

答案 1 :(得分:4)

嗯,不是我知道的。对于Hindley-Milner型系统来说,这将是困难的,后者构成了这些语言的类型系统的基础。 (在Haskell命名法中)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)))))))

InO是“身份构造函数” - 它们仅用于指导类型检查,因此您可以在心理上删除它们并获得所需内容。但是,遗憾的是,你无法将它们移除。

我们可以轻松制作cons功能。模式匹配我们不是那么幸运。我不能代表其他ML家庭语言,但IIRC他们甚至不能代表像Mu这样的高等语种。