【问题标题】:Inferring type of composed function Haskell推断组合函数 Haskell 的类型
【发布时间】:2015-03-17 21:14:19
【问题描述】:

我无法推断此函数的类型:

(foldr (.))

我知道以下类型:

(.) :: (b -> c) -> (a -> b) -> a -> c

foldr :: (a -> b -> b) -> b -> [a] -> b

但是现在我不知道该怎么做.. 有没有一种方法可以始终以系统的方式推断类型?如何适用于本案?

【问题讨论】:

标签: function haskell types composition


【解决方案1】:

我通常遵循以下步骤:

写出他们的类型:

(.) :: (b -> c) -> (a -> b) -> a -> c
foldr :: (a -> b -> b) -> b -> [a] -> b

使所有类型变量名不同:

(.) :: (b -> c) -> (a -> b) -> a -> c
foldr :: (x -> y -> y) -> y -> [x] -> y

现在由于您将(.) 应用于foldr 的第一个参数,您可以推断出类型之间的以下关系:

foldr :: (   x ->       y ->         y  ) -> y -> [x] -> y
(.) ::   (b -> c) -> (a -> b) -> (a -> c)

从上面可以推断出如下关系:

x ~ (b -> c)
y ~ (a -> b)
y ~ (a -> c)

从上面的y可以推断出bc应该是一样的。

foldr (.) 的类型应该是:

foldr (.) :: y -> [x] -> y

现在将yx 替换为新派生的,您将获得所需的类型:

foldr (.) :: (a -> b) -> [b -> b] -> a -> b

【讨论】:

  • 非常感谢您的解释。我唯一的问题是,你怎么知道把括号放在哪里?我的意思是,你不能给表达式加上括号,以便 x ~ b, y ~ c->a->b, y~ a->c 。在这种情况下,类型推断完全不同。
  • @user3558296 那是因为(.)的类型是(b -> c) -> (a -> b) -> a -> c(.) 的括号部分已经固定。
  • 非常感谢我现在明白了.. 现在我试图使用您解释的方法推断 (.flip) 的类型,我得到了:[code] (b -> a -> c1 -> c) -> a -> b -> c1 -> c[/code] 但是 ghci 说类型是 [code] ((b -> a -> c1) -> c) -> (a -> b -> c1) -> c[/code] 为什么 ghci 给 b->a->c1 表达式加上括号?
猜你喜欢
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
相关资源
最近更新 更多