[] (空のリスト) と None/Nothing はとても似ているように思えます。その言語ファミリーのいずれかに、各要素がオプションでテール ガードが Nothing である基本的なリスト型があるかどうか疑問に思っていました。
パターンマッチングリストが過度に冗長になるため、(別の型を持つ言語ではこのように行われません) ですか?
[] (空のリスト) と None/Nothing はとても似ているように思えます。その言語ファミリーのいずれかに、各要素がオプションでテール ガードが 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
は「IDコンストラクター」です。これらは型チェックをガイドするためにのみ存在するため、精神的に削除することができ、必要なものを手に入れることができます。ただし、残念ながら、物理的に削除することはできません。
cons
簡単に関数を作ることができます。パターンマッチングはそれほど幸運ではありません。私は他のMLファミリー言語について話すことはできませんが、IIRCは、のようなより種類の多いタイプを表すことさえできませんMu
。