haskell - 为什么 a -> b -> c 函数参数可以接受 a -> a 类型?
问题描述
这编译成功:
test = f id
f :: (a -> b -> c) -> String
f g = "test"
id
有 type a -> a
,但f
有 type 的第一个参数(a -> b -> c)
。
我认为它不应该编译。我不明白。
解决方案
因为您可以绑定未实例化的变量。f :: (a -> b -> c) -> String
表示对于任何 3 种类型 a、b 和 c,f 采用从 a 到 b 到 c 的函数并返回字符串。
重要的是要记住这f :: (a -> b -> c) -> String
相当于f :: (a -> (b -> c)) -> String
因为 currying。
id
接受任何类型,并返回该类型。
因此,如果我们将其换入,id
是返回b -> c
,并采取a
,所以如果a
can be b -> c
which it can as a can 是任何类型,那么这很好。
推荐阅读
- android - 如何直接从 Android Intent 在 Fiverr App 中打开用户个人资料
- android - 从图库中获取图像时的问题
- mysql - 基于购买日期的每日消费增量
- ios - 在多个单元格选择 Swift 中自动更改背景颜色
- javascript - 谷歌地图 javaScript API 缓存
- java - IPC安卓注入
- android-studio - 无法解决:play-services-basement
- javascript - JavaScript:this.$emit('closeRequest') 未在 vue 开发工具中创建任何事件
- php - 缩写的数据库记录但在单词搜索时出现问题
- javascript - Firebase 数据库等于查询