Haskell: 从类型推导函数

3
今天我在尝试使用 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 :: a -> (a -> b) -> b”,但卡住了。

2
sepp2k已经回答了你的问题,但值得注意的是flip id是你的¢的等效定义,这使得你所指出的属性的原因更加明显(至少对我来说是这样)。 - Travis Brown
1
换句话说,冒着过度解释的风险,id :: a -> a 在函数上的特殊化等价于 ($) :: (a -> b) -> (a -> b)。泛型编程真是太棒了! - C. A. McCann
3个回答

8

x =::= x x ($)对于类型a -> b -> ax = const也成立。因此,它并不能唯一地识别类型。


8

我想补充一点,你应该看看http://hackage.haskell.org/package/djinn。它可以根据许多类型签名推导出实现。如果djinn能理解的类型只有一种可能的实现,它会生成它。


1
从上面的方程式中,我们可以确定 x 的一些类型签名。X 不需要具有此类型,但它至少需要与此类型 统一
$ :: forall a b. (a -> b) -> a -> b
x :: t1 -> ((a -> b) -> a -> b) -> t1

鉴于此,编写多种x的实现应该是直截了当的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接