2016-11-04 66 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,正如錯誤所暗示的那樣),當類型未能統一時,你會遇到一個更醜陋的錯誤。