2016-08-23 8 views
2

行多型レコードを表す型/エイリアスを定義する方法はありますか?多型レコード型エイリアスの構文

だから私は別名としてレコード型を定義したい

tester :: forall r. {val :: Int | r} -> Int 
tester a = 
    a.val 

callTester = tester {val: 1, b: 2} 

この例を与えられました。何かのように

type Val = forall r. {val :: Int | r} 

tester :: Val -> Int 
tester a = 
    a.val 

callTester = tester {val: 1, b: 2} 

しかし、それはコンパイルされません。

複数の型を定義するより大きなレコードとより複雑な関数の場合、かなりのノイズが発生します。これを因数分解すると良いでしょう。例: fn :: a -> b -> aaを2回定義する必要があります

非多形レコードの場合はシンプルですが、前もってわからない追加のフィールドを持つレコードを明示的に許可したいと考えています。

ありがとうございます。

答えて

3

ここでは、上記の例でどのように動作しているのですか。

type Val r = {val :: Int | r} 

tester :: forall a. Val a -> Int 
tester v = 
    v.a 

callTester = tester {val: 1, b: 2} 

ので、タイプを定義して、タイプ

を使用して機能に forallを持っています