在我看來,像[](空列表)和None/Nothing是如此相似。 我想知道是否有任何的語言家族有基本的列表類型,其中每個元素是一個選項,尾部守衛是什麼?是否有一種ml語言(標準ml/ocaml/f#/ haskell /等),其中列表元素是選項類型
是不是(這樣做,在具有不同類型的語言中),因爲它會使模式匹配列表過於冗長?
在我看來,像[](空列表)和None/Nothing是如此相似。 我想知道是否有任何的語言家族有基本的列表類型,其中每個元素是一個選項,尾部守衛是什麼?是否有一種ml語言(標準ml/ocaml/f#/ haskell /等),其中列表元素是選項類型
是不是(這樣做,在具有不同類型的語言中),因爲它會使模式匹配列表過於冗長?
您在Lisp中有類似的地方,其中nil
既用於表示缺少可選值,也用於表示空列表。你可以做這樣的事情在Haskell(我假設大多數ML類語言),
newtype MyList a = MyList (Maybe (a, MyList a))
但它是更冗長,沒有超過使用它自己的數據類型的任何明顯的好處。
嗯,不是我所知道的。這對於辛德雷 - 米爾納型系統來說很難,它構成了這些語言的類型系統的基礎。 (在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)))))))
In
和O
是「身份建設者」 - 他們的存在只是爲了指導類型檢查,這樣你就可以精神上刪除它們,你有你想要的。但是,不幸的是,你無法實際移除它們。
我們可以輕鬆製作cons
功能。我們對模式匹配沒有那麼幸運。我不能說其他ML家族的語言,但是IIRC他們甚至不能代表Mu
等更高級的類型。
你知道嗎,或者你可以忘記所有那些「垃圾」垃圾,並且做@hammar所說的話。嘆氣,仍然是一個過度工程師:-) – luqui
會有什麼好處?爲不同目的定義不同的類型是一件好事。 –