首页 > 解决方案 > 在 haskell 中使用匿名与非匿名函数键入

问题描述

为什么当我输入这个身份时会编译它

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

但是这个没有?

f x = x :: a -> a

当我刚写

f x = x

并将其加载到 ghci 并输入 :tf 我收到

f :: p -> p

那么,不应该是一样的吗?

我收到的错误是

无法将预期类型 'a1 -> a1' 与实际类型 'p' 匹配,因为类型变量 'a1' 将逃脱其范围 此(刚性,skolem)类型变量受表达式类型签名约束:forall a1。a1 -> a1

我已经在谷歌上搜索了僵化的、skolem 的东西和错误,但它只给了我更多的问题。

最初我想编写一个函数,它接受两个输入并返回第一个,它只适用于匿名函数。所以我似乎对 lambdas 和打字缺乏一些了解。我仍处于学习 Haskell 的初期。

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

标签: haskell

解决方案


您将类型签名:: a -> a应用于x,而不是f。您可以添加类型签名:

f :: a -> a; f x = x

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

{-# LANGUAGE ScopedTypeVariables #-}

f :: forall a . a -> a
f x = x :: a

推荐阅读