haskell - 如何确定 Haskell 函数的类型?

标签 haskell functional-programming

这个问题在这里已经有了答案:





Type Inference in Haskell for functions

(1 个回答)


2年前关闭。




我正在准备我的考试,但有些东西我无法理解。

功能:

tw f x = f (f x)
f x y = (y, x)

我能够确定“f”的类型是
f :: t1 -> t -> (t, t1)

但无法确定“tw”的类型。

假定类型 tw:
tw :: (t -> t) -> t -> t

谢谢!

最佳答案

让我们分析一下函数tw :

tw f x = f (f x)
twf 为参数和 x .目前我们对这些参数了解不多,所以我们将它们作为类型 f :: ax :: b .

现在我们看到一个带有 f 的函数应用程序。函数和x参数。因此,这意味着 f是一个接受 b 类型值的函数( x 的类型),并返回一些东西。因此,我们指定 f类型为 f :: b -> c , 与 c我们引入了一个新的类型变量。因此我们知道 f x :: c .

我们进一步看到,有一个功能应用程序 f :: b -> c函数和 f x :: c参数。由于f的参数类型是 b , 和 f x类型为 c .因此我们得出结论,bc必须是同一类型。

因此,这意味着我们派生为类型:
x :: b
f :: b -> b

我们可以进一步分析 tw f x 的类型通过确定 f (f x) 的类型.由于f x有类型 f x :: b , 和 f有类型 f :: b -> b , 我们知道 f (f x)有类型 f (f x) :: b .这意味着 tw 的类型是:
tw :: (b -> b) -> b -> b

如果我们替换 b对于 t ,然后我们获得预期的类型签名。但是自从bt只是变量,没关系。

关于haskell - 如何确定 Haskell 函数的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58285479/

相关文章:

haskell - 返回相同类型类的两种类型之一

data-structures - 空间数据的数据结构

javascript - 在数组中查找唯一对

python - 列表理解与 lambda + 过滤器

c++ - 传递函数对象 : Error

haskell - 添加元素的函数式编程风格的映射函数?

haskell - 关闭 leksah 中的警告

parsing - Happy 中命题逻辑解析器中的移位/减少冲突

haskell - 是否有类似 runDB 但在 Handler monad 之外的东西?

haskell - 真实世界#在哪里定义的?