为什么我键入此身份时会编译该身份
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
答案 0 :(得分:6)
您将类型签名memoryCache.Remove(yourkeycache)
应用于:: a -> a
,将 not 应用于x
。您可以使用以下方式添加类型签名:
f
但是,无论如何f :: a -> a; f x = x
不能为x
类型,因为:: a
是与外部类型签名中的a
不同的类型变量。您可以启用ScopedTypeVariables
[ghc-doc]扩展名,以使用在外部作用域中定义的类型变量,例如:
a