2016-11-04 6 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がそのような式を許可している場合(またはエラーが示すようにFlexibleContextを有効にした場合)、後で統一できなかった場合には醜いエラーが発生します。

関連する問題