【问题标题】:Haskell: Deducing function from typeHaskell:从类型推导函数
【发布时间】: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)。多态性不是很好吗?

标签: haskell types


【解决方案1】:

x =::= x x ($) 也适用于 x = const,其类型为 a -> b -> a。所以它不能唯一标识类型。

【讨论】:

    【解决方案2】:

    我想补充一点,你应该看看http://hackage.haskell.org/package/djinn。它可以采用许多类型签名并从中派生一个实现。如果 djinn 理解的类型只有一个实现可能,它就会产生它。

    【讨论】:

      【解决方案3】:

      从上面的等式中,我们可以确定 x 的一些类型签名。 X 不需要有这种类型,但它至少需要统一与这种类型。

      $ :: forall a b. (a -> b) -> a -> b
      x :: t1 -> ((a -> b) -> a -> b) -> t1
      

      鉴于此,编写 x 的大量实现应该很简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        • 1970-01-01
        • 2013-05-31
        • 1970-01-01
        • 2016-01-24
        相关资源
        最近更新 更多