【问题标题】:Why do these Haskell functions have these types?为什么这些 Haskell 函数有这些类型?
【发布时间】:2016-09-02 03:05:33
【问题描述】:

有人能解释一下为什么这两个函数有这些类型吗?我想我知道第一个应该强制 g 的返回值与 x 相同,因为 let 中 (g y) 的位置对应于函数参数中 x 的位置,但似乎在第二个函数中它不是那样工作的。

f3 g x = let h y = f3 g (g y) in g x  
(t -> t) -> t -> t  
f4 g x = let h y = f4 g (g y) in x  
(t1 -> t) -> t -> t

【问题讨论】:

    标签: haskell types functional-programming


    【解决方案1】:

    f3 是两个参数的函数,因此具有t2 -> t1 -> t 类型。因为函数的结果是g x,所以它的类型是tg 本身必须是一个参数的函数,采用 t1 类型的 x,因此 g 的类型为 t2 = t1 -> th y 的未使用定义要求 g 接受其结果类型作为导致 t1 = t 的参数类型。这会导致(t -> t) -> t -> t

    f4 又是两个参数的函数,因此具有t3 -> t2 -> t 类型。因为它只返回x,所以t2 必须等于th y的定义 将g y 限制为t2 又名t 类型,但对y 的类型没有限制,我们称之为t1。这导致t1 -> t 的类型为g。然后将等式代入(t1 -> t) -> t -> t

    【讨论】:

      【解决方案2】:
      f3 g x = let h y = f3 g (g y) in g x
      

      我们先看一个更简单的版本:

      f3' g x = g x
      

      这里g应用于xg的结果变成f3'的结果。所以f3'的类型是(a -> b) -> a -> b

      完整的f3 包含子表达式f3 g (g y),它引入了一些额外的约束:f3 g 是无害的(没有额外的约束,因为g 是我们在开始时调用的参数),但是(如您在问题中说)将g y 作为第二个参数传递意味着g 的结果必须与x(第二个参数)具有相同的类型。

      这意味着a = b,因此是f3 :: (a -> a) -> a -> a


      在你的第二个例子中,我们有

      f4 g x = let h y = f4 g (g y) in x
      

      没有let,只是:

      f4' g x = x
      

      类型为a -> b -> b

      完整的f4 包含f4 g (g y)。一方面,这意味着g 必须是一个函数(因为它应用于y),所以我们的约束集如下所示:

      f4 :: a -> b -> b
      g :: a
      x :: b
      g :: c -> d
      a = c -> d
      

      那么(g y)被用作f4的第二个参数,这意味着它的类型必须等于b

      g y :: b
      g :: c -> b
      y :: c
      d = b
      

      h 未使用,因此yf4 上没有附加限制。代入f4类型的变量,我们得到

      f4 :: (c -> b) -> b -> b
      

      (相当于(t1 -> t) -> t -> t取模命名)。

      【讨论】:

        猜你喜欢
        • 2014-04-30
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 2020-06-17
        • 1970-01-01
        • 1970-01-01
        • 2020-12-29
        • 1970-01-01
        相关资源
        最近更新 更多