LinearTypes
examples
packages
LinearTypes使うならこれを入れておくと便利mrsekut.icon
簡単な例
code:hs
tuple1 :: Int %1 -> Int %1 -> (Int, Int)
tuple1 a b = (a, b)
2つの引数a, bは共にIntの線形型である
つまり、両方とも内部で1度ずつ使われる
code:hs
data Multiplicity = One | Many
線形型がOneで、ソレ以外の通常の型がManyとなる
code:hs
type a %1 -> b = a %One -> b
type a -> b = a %Many -> b
エラーになる例
線形型が2回以上使われている
code:hs
tuple2 :: Int %1 -> (Int, Int)
tuple2 a = (a, a)
code:error
Couldn't match type ‘'Many’ with ‘'One’ arising from multiplicity of ‘a’
aは線形型だが、(a,a)と2回使われいてるのでerror
線形型が1度も使われていない
code:hs
tuple3 :: Int -> Int %1 -> (Int, Int)
tuple3 a b = (a, a)
code:error
Couldn't match type ‘'Many’ with ‘'One’ arising from multiplicity of ‘b’
bは線形型だが、1度も使われていないのでerror
syntax error
code:hs
tuple4 :: Int -> Int %2 -> (Int, Int)
tuple4 a b = (a, a)
%1という表記しか許されていない
usecases
これはなんでerrorになるの?
code:hs
add :: Int %1 -> Int %1 -> Int
add a b = a + b
aとbの両者に対して違反していると怒られる
あ、普通に(+)が線形型を許容していないからかmrsekut.icon
なんで%1という記法になったのか気になる
提案時は、a ->. (a,a)のように、->.を使ってたっぽい 今後Affine型やRelavant型を追加したくなったら、%<1とか%>1とかにしたりするんだろうかmrsekut.icon
参考
簡潔にまとまっていて良い
ながい