2016-11-04 40 views
2
*> 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)有效。
我认为它们是相同的,我无法理解错误信息。
我想知道为什么?haskell中的“sin sin 0.5”和“sin(sin 0.5)”有什么区别?

+3

它们不相同。函数应用程序是左关联的,因此“sin sin 0.5”实际上是“(sin sin)0.5”,这不是你的意思,并导致类型错误。 – duplode

+1

[了解Haskell优先级规则如何与多个部分应用程序一起工作]的部分副本(http://stackoverflow.com/questions/17243075/understanding-how-haskell-precedence-rules-work-with-multiple-partial-applicatio) – duplode

回答

10

简短的回答:sin sin 0.5解析为(sin sin) 0.5

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