在Haskell中使用匿名函数与非匿名函数进行键入

时间:2019-12-04 12:09:03

标签: haskell

为什么我键入此身份时会编译该身份

f = (\x -> x) :: a -> a

但这不是吗?

f x = x :: a -> a

当我写

f x = x

将其加载到ghci中,然后输入:t f我收到

f :: p -> p

所以,难道不是同一回事吗?

我收到的错误是

  

无法将预期的类型“ a1-> a1”与实际类型“ p”匹配           因为类型变量“ a1”将逃避其范围         此(刚性,skolem)类型变量受以下约束           表达式类型签名:             永远a1。 a1-> a1

我已经在刻板的问题上搜索了僵硬的东西,但它只给了我更多的问题。

最初,我想编写一个具有两个输入并返回第一个输入的函数,该输入仅适用于匿名函数。因此,对于lambda和输入,我似乎缺乏理解。我仍在学习Haskell。

f = (\x y -> x) :: a -> b -> a

1 个答案:

答案 0 :(得分:6)

您将类型签名memoryCache.Remove(yourkeycache) 应用于:: a -> a,将 not 应用于x。您可以使用以下方式添加类型签名:

f

但是,无论如何f :: a -> a; f x = x不能为x类型,因为:: a是与外部类型签名中的a不同的类型变量。您可以启用ScopedTypeVariables [ghc-doc]扩展名,以使用在外部作用域中定义的类型变量,例如:

a