等级3类型功能示例

时间:2017-02-01 09:13:11

标签: haskell rank-n-types

我有这个Rank 3 Type函数定义:

f3 :: ((forall a. a -> a) -> Int) -> Bool -> Bool
f3 .... = ?

我正在努力为它写一个简单的例子。你能帮忙吗?

1 个答案:

答案 0 :(得分:3)

f3 :: ((forall a. a -> a) -> Int) -> Bool -> Bool
f3 f b = (f id == 3) && b

f3_ex :: Bool
f3_ex = f3 f True where
   f :: (forall a. a -> a) -> Int
   f g = g 3

如评论中所述,将类型更改为更有趣:

f4 :: ((forall a. a -> a -> a) -> Int) -> Bool -> Bool
f4 f b = (f const == 3) && b

f4_ex :: Bool
f4_ex = f4 f True where
   f :: (forall a. a -> a -> a) -> Int
   f g = g 3 5


f5 :: ((forall a. a -> a -> a) -> Int) -> Bool -> Bool
f5 f b = f (if b then const else const id) == 42

f5_ex :: Bool
f5_ex = f5 f True where
   f :: (forall a. a -> a -> a) -> Int
   f g = g 3 5 + 39

此处f基本上属于(Int, Int)类型,第一个组件由f const提供,另一个组件由f (const id)或等效f (flip const)提供。