haskell - haskell中的 `sin sin 0.5`和 `sin (sin 0.5)`有什么区别?

标签 haskell syntax

*> sin sin 0.5  
<interactive>:10:1:
Non type-variable argument in the constraint: Floating (a -> a)
(Use FlexibleContexts to permit this)
When checking that ‘it’ has the inferred type
  it :: forall a. (Floating a, Floating (a -> a)) => a

但是 sin (sin 0.5) 有效。
我认为它们是相同的,我无法理解错误信息。
我想知道为什么?

最佳答案

简答:sin sin 0.5 解析为 (sin sin) 0.5

长答案:表达式 sin sin 0.5 解析为 (sin sin) 0.5。现在,正弦函数适用于任何 Floating 类型。所以 Haskell 试图推断你的表达式的类型,确定 sin::Floating a => a -> a 必须是 float 的,所以 Floating a => a -> a 是一个浮点类型。但是 Haskell 不允许像 a -> a 这样的复杂类型出现在上下文表达式中,所以你会得到那个错误。如果 Haskell 允许这样的表达式(或者如果您启用了 FlexibleContexts,正如错误提示的那样),当类型稍后无法统一时,您将得到一个更丑陋的错误。

关于haskell - haskell中的 `sin sin 0.5`和 `sin (sin 0.5)`有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40414785/

相关文章:

css - css 变量名可以以数字开头吗?

java - 方法可以在不声明的情况下抛出 java.lang.Exception 吗?

javascript - 当我有 2 个 jquery 库时,文档就绪无法工作

Haskell:如何漂亮地打印不带引号的字符串?

haskell - Haskell 中的惰性前向引用

haskell - stack的默认模板是什么?

haskell - 将 literate Haskell (.lhs) 转换为 Haskell (.hs)

haskell - Haskell 中 Nothing 的类型是什么?

php - 这些在php中是什么?例如:$ _ COOKIE [],$ _ POST []等

Objective-C block 语法