表征可以接受`()`作为输入的函数类型(没有单态化)

下面是几个简单的函数:

f1 :: () -> ()
f1 () = ()

f2 :: a -> a
f2 a = a

f3 :: a -> (a, a)
f3 a = (a, a)

f4 :: (a, b) -> a
f4 (a, b) = a

所有的f1f2以及f3能够接受()为输入。另一方面,当然f4不能接受()f4 ()是类型错误。

是否有可能TYPE-理论上刻画了什么f1f2以及f3有什么共同点?具体而言,是有可能定义一个acceptsUnit函数,以使得acceptsUnit f1acceptsUnit f2acceptsUnit f3是公类型的,但acceptsUnit f4是一种类型的错误-和不具有其他的效果?

下面完成了部分工作,但将其输入单态化(在 Haskell 中,我在 Hindley-Milner 中收集),因此其效果不仅仅是简单地断言其输入可以接受()

acceptsUnit :: (() -> a) -> (() -> a)
acceptsUnit = id

-- acceptsUnit f4     ~> error 
-- acceptsUnit f3 'a' ~> error ??

当然,同样的单态化发生在下面。在这种情况下,被注释的类型acceptsUnit'是它的主要类型。

acceptsUnit' :: (() -> a) -> (() -> a)
acceptsUnit' f = let x = f () in f

以上是表征可以接受`()`作为输入的函数类型(没有单态化)的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>