Skip to content

nojima/typed-lambda

Repository files navigation

型付きラムダ計算

標準入力に渡された項を解釈し、型検査して実行します。 単純なラムダ計算にはラムダ抽象と関数適用ぐらいしかありませんが、それだとサンプルが書きにくいので自然数とBoolとif式を実装しています。

stack run < samples/sample1.txt

文法

この言語に存在する型は以下の3つのみです。

Int       -- 整数
Bool      -- Boolean
T1 -> T2  -- T1からT2への関数

リテラル

自然数リテラルとBoolリテラルがあります。

0
100
true
false

ラムダ式

ラムダ式は以下のような構文です。 引数は必ず一つで、型を必ず明記しなければいけません。

-- identity function
lambda x:Int . x

引数を複数個取るような関数が欲しいときはラムダをネストさせてください。

lambda f:Int -> Int .
    lambda n:Int .
        f n

関数適用

項を並べれば関数適用になります。関数適用は左結合です。

(lambda x:Int . x * x) 100

if式

以下のように if ... then ... else ... という構文です。

if true then 10 else 20

let式

let name = expr in ... という構文で式を変数に束縛できます。

let x = 10 in x * x

ラムダを束縛すると名前付き関数の宣言として使えます。

let f = lambda x:Int .
    x * x
in
f 100

二項演算子

シンボル 意味 結合
+ 足し算 Int -> Int -> Int
- 引き算 Int -> Int -> Int
* 掛け算 Int -> Int -> Int
/ 割り算(小数点以下切り捨て) Int -> Int -> Int
&& 論理積 Bool -> Bool -> Bool
` ` 論理和
== 等しい ∀a. a -> a -> Bool

コメント

-- による行コメントと {- ... -} という範囲コメントが使えます。

About

Hindley-Milner型推論を実装してみる

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors