2011-07-09 43 views
1

在我看來,像[](空列表)和None/Nothing是如此相似。 我想知道是否有任何的語言家族有基本的列表類型,其中每個元素是一個選項,尾部守衛是什麼?是否有一種ml語言(標準ml/ocaml/f#/ haskell /等),其中列表元素是選項類型

是不是(這樣做,在具有不同類型的語言中),因爲它會使模式匹配列表過於冗長?

+1

會有什麼好處?爲不同目的定義不同的類型是一件好事。 –

回答

5

您在Lisp中有類似的地方,其中nil既用於表示缺少可選值,也用於表示空列表。你可以做這樣的事情在Haskell(我假設大多數ML類語言),

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

但它是更冗長,沒有超過使用它自己的數據類型的任何明顯的好處。

4

嗯,不是我所知道的。這對於辛德雷 - 米爾納型系統來說很難,它構成了這些語言的類型系統的基礎。 (在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) 

同構什麼你所要求的,但它是一個屁股疼痛。我們可以做一個利弊的功能很容易:

In (O (Just (1, In (O (Just (2, In (O Nothing))))))) 

InO是「身份建設者」 - 他們的存在只是爲了指導類型檢查,這樣你就可以精神上刪除它們,你有你想要的。但是,不幸的是,你無法實際移除它們。

我們可以輕鬆製作cons功能。我們對模式匹配沒有那麼幸運。我不能說其他ML家族的語言,但是IIRC他們甚至不能代表Mu等更高級的類型。

+2

你知道嗎,或者你可以忘記所有那些「垃圾」垃圾,並且做@hammar所說的話。嘆氣,仍然是一個過度工程師:-) – luqui

相關問題