haskell - 在 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
解决方案
您将类型签名:: 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
推荐阅读
- php - Composer 错误:您的要求无法解析为一组可安装的软件包
- flutter - 列表
到地图 在 Dart 到 Firestore - python - 将 YUV_NV12 转换为 YUV444
- http-live-streaming - Exoplayer 播放时边缘粗糙
- vue.js - 使用 Vue CLI V4 调试 Vue 3
- css - WYSIWYG ACF 字段似乎采用了来自周围 div 的 css 样式
- azure - 在 Azure 存储数据湖中保存 JSON 文件以 NUL (Ascii 0) 字符和空格结束
- javascript - 如何以角度为 setTimeout 函数和 activeElement 编写单元测试?
- vue.js - 带有 Jitsi 或 Zoom 的 Vue3
- reactjs - react.js 中反应组件样式的语法