首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在haskell中功能结合需要配子?

为什么在haskell中功能结合需要配子?
EN

Stack Overflow用户
提问于 2021-05-22 16:12:51
回答 1查看 69关注 0票数 0
代码语言:javascript
复制
Prelude> -- I have 2 functions: f and g
Prelude> f x y = x + y
Prelude> g x = 2*x
Prelude> f 2 3
5

要用x=2和y=3表示x=2和y=3,可以很好地完成以下工作:

代码语言:javascript
复制
Prelude> f 2 (g 3)
8

为什么会出现以下返回错误?

代码语言:javascript
复制
Prelude>
Prelude> f 2 g 3

<interactive>:19:1: error:
    • Non type-variable argument in the constraint: Num (a -> a)
      (Use FlexibleContexts to permit this)
    • When checking the inferred type
        it :: forall a. (Num a, Num (a -> a)) => a
Prelude> 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-22 16:25:05

代码语言:javascript
复制
f 2 g 3

是(因为函数应用程序left-associative):)

代码语言:javascript
复制
f 2 g 3 = ((f 2) g) 3

这就是为什么您会得到这个错误&它期望g有一个Num (因为它是f x y = x+y+ :: Num a -> a -> a -> a中的参数y )。

2作为一个文本在每个Num a中都可以是一个值,但是GHC不知道Num的一个实例,它是一个函数a -> a

现在,错误本身讨论了上下文-- basic不可能有Num ((->) a a)形式的约束--但是您可以很容易(并且安全地)使用给定的扩展来规避这个问题。然后,您应该得到类型类的错误。

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

https://stackoverflow.com/questions/67651692

复制
相关文章

相似问题

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