【发布时间】:2012-04-29 21:32:54
【问题描述】:
所以我今天在玩 Haskell,考虑自动生成给定类型的函数定义。
例如函数的定义
twoply :: (a -> b, a -> c) -> a -> (b, c)
给定类型对我来说很明显(如果我排除使用undefined :: a)。
然后我想出了以下内容:
¢ :: a -> (a ->b) -> b
¢ = flip ($)
它具有有趣的特性
(¢) ¢ ($) :: a -> (a -> b) -> b
这让我想到了我的问题。给定关系=::= 为“具有相同的类型”,语句x =::= x x ($) 是否唯一地定义了x 的类型?必须x =::= ¢,或者x是否存在另一种可能的类型?
我试图从 x =::= x x ($) 向后推导 x :: a -> (a -> b) -> b,但陷入了困境。
【问题讨论】:
-
sepp2k 已经回答了您的问题,但值得注意的是
flip id是您的¢的等效定义,这使得您注意到属性的原因更加明显(至少对我来说, )。 -
换句话说,冒着过度解释的风险,专用于函数的
id :: a -> a等价于($) :: (a -> b) -> (a -> b)。多态性不是很好吗?