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

时间:2016-11-04 03:24:57

标签: 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)有效。
我认为它们是相同的,我无法理解错误信息 我想知道为什么?

1 个答案:

答案 0 :(得分: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,正如错误所示),那么当类型以后无法统一时,你会得到一个更加丑陋的错误。