プログラミング言語に関する妄想

その一

Haskellに依存型があれば、カッコいい。

その二

また、アドホックな多相型? があれば便利だと思う(型を集合とすると、集合の直和ではなく、集合の合併に相当する)。
(A | B)をA型でもB型でもよいアドホックな多相型だとすると、

 f a = if a then 1 else "zero"

は、

 f :: Bool -> (Int | [Char])

型推論される。

関数の積・和

次のような関数の積を定義すれば有用かもしれない*1

 f :: A -> B
 g :: C -> D

 f * g :: (A, C) -> (B, D)
 f * g = \(a, c) -> (f a, g c)

関数の和は、アドホックな多相型にしたほうが有益だろう。

 f + g :: ( A -> B | C -> D )

もし、

 h1 :: A -> B
 h2 :: C -> B

なら、事実上

 h1 + h2 :: (A | C) -> B

となり、型による場合分けが簡単に書ける。

リテラルの多相型

Label型というのを作って、リテラルは全てLabel型でも有りえる多相型にすれば、Lispのマクロのような機能が使えるのではないか? 基本的に遅延評価であるHaskellでマクロが使えて何が嬉しいのかは良く分からない。考え中(インタプリタ環境では意味があるだろうが)。

コードの多相型

()がリストとも、関数適用だとも解釈してくれるようにすることはできないだろうか。例えば、次のようなコードは

 (f x)

次のような文脈では、

 f :: A -> B
 x :: A
 g :: (A -> B, A) -> C
 g(f x)

次のように解釈される:

 (f x) :: (A -> B, A)

次のような文脈では、

 f :: A -> B
 x :: A
 g :: B -> C
 g(f x)

次のように解釈される:

 (f x) :: B

レイアウトによるタプル

例えば、

 f x = g a b c
         d e f
         g h i

は次のように解釈されたら便利。

 f x = g (a b c)
         (d e f)
         (g h i)

*1:っていか、たぶんあるな、これは。