首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么类型是Char -> Char -> Char

为什么类型是Char -> Char -> Char
EN

Stack Overflow用户
提问于 2017-02-21 10:17:20
回答 2查看 83关注 0票数 2

我有以下类型的签名:

代码语言:javascript
运行
复制
*Main Lib> let f :: a -> a -> a -> a; f = undefined  
*Main Lib> let x :: Char; x = undefined 

为了找出我会得到哪种结果类型,我做了:

代码语言:javascript
运行
复制
*Main Lib> :t f x
f x :: Char -> Char -> Char

好呀

代码语言:javascript
运行
复制
Char -> Char -> Char -> Char

因为第一个参数已经被x替换了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-21 10:24:08

是的,完全正确。考虑一个不同的函数,length :: [a] -> Int。如果您要求类型的length "abc",您将得到Int

代码语言:javascript
运行
复制
Prelude> :t length "foo"
length "foo" :: Int

通常,如果您有一个函数f :: A -> B和一个参数x :: A,那么f x :: B

在您的例子中,我们有f :: a -> (a -> a -> a) (专门用于a = Char),因此A = CharB = Char -> Char -> Char

(a -> a -> a -> aa -> (a -> a -> a)相同,因为类型中的->是正确的关联。)

票数 3
EN

Stack Overflow用户

发布于 2017-02-21 10:21:20

这是因为f x是函数f,它的第一个参数已经被应用了,所以它只需要另外两个就可以得到结果。这就是所谓的赛跑。

在Haskell中,没有像函数这样有三个参数的东西。a -> a -> a -> a的意思是“接受a的函数,返回接受a的函数,返回接受a并返回a的函数”。

这是一个很大的口才写出来,所以只要加入一些家长,它会变得更清楚:a -> (a -> (a -> a))

所以f x给了你a -> (a -> a)。恰巧Haskell的语法允许你说f x y z,就像你在用三个参数调用一个函数一样,编译器很聪明,在不需要的时候就不会构造所有中间的咖喱函数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42364529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档