2016-12-04 98 views
4

新來的Haskell,我在這片表達式的爲什麼(!!)和(。)共享優先級9?

matches !! length . count 

不能混合打一個簡單的錯誤「!!」 [infixl 9]和'。' [infixr 9] in the infixr表達式

這讓我感到驚訝 - 爲什麼這些運營商會有優先權?什麼阻止了Haskell的設計者在以上的優先級比(!!)

我無法想象這只是被忽視,所以我認爲這裏有一個理由,我失蹤了。

注意我認識到,應用(!!)到由(.)組成的功能仍然會導致在編譯時錯誤。我很好奇爲什麼Haskell的設計方式允許出現這個意外的錯誤信息。

+4

爲什麼你會想到'.'有比'的優先級高!!',而不是周圍的其他方式? – melpomene

+3

我不確定在這個特定的衝突背後是否有理由。只有「十級」的優先級,一些衝突必然會發生。 – duplode

+3

@duplode,十個優先級的選擇是坦率的離奇。我希望在等價關係下有更像偏序的東西,從而允許運算符對任意其他運算符的優先級更高,更低或相等。但我想設計師並不想爲此設計一個真正複雜的系統。 – dfeuer

回答

11

我去挖掘。兩個中綴運營商可能沒有相同優先順序的韻律或理由。在Haskell 1中。0報告,於1990年發佈,在(!!)運營商在PreludeList.hs文件被發現,(.)經營者在Prelude.hs文件。因爲它們處理完全不同的事情(函數組合與列表索引),並且它們處於完全不同的文件中,所以它們很可能不是交叉協調的。

此外,報告內,在前奏這些函數幾乎沒有提到。 (.)在一個襯墊剛纔提到作爲組合物的功能和(!!)未在實際的源文件的所有外提及。

其原因應該是或多或少明顯。 Prelude是有用的,但這不是Haskell開發的原因,它不是語言設計中很難,有趣的部分。哈斯克爾更多地是關於lambda微積分和類別理論,而不是列表索引。所以沒有多少想法(或者至少不是很多文檔!)進入到各種運營商的優先順序中並不奇怪。

+0

這提供了我正在尋找的宣泄,感謝您的挖掘! – Matt

8

Haskell有很多運營商。運行

grep -hor '^infix[lr]\{0,1\} .*$' ghc/libraries/ | sort -u 

我的GHC頭裏面我找回137個運營商。並非所有這些都是暴露的,但仍然是:因爲優先級必須介於09之間,衝突是不可避免的。

  • $應該比幾乎所有(固定性0)
  • >>=應該比$(固定性1)
  • ||應該比>>=更高(固定性2)更高下
  • &&應高於||(固定3)
  • ==應該高於&&(固定4)
  • ++應高於==(固定性5)
  • +應該比++(固定性6)
  • *應該比+更高(固定性7)更高
  • ^應該比*更高(固定性8)
  • !!應該比^(固定性9)
  • .應高於p更高retty很多東西(固定9)

所以沒有真正的空間來區分!!.的優先順序。另外,我認爲.!!預計會有更高的優先順序,這是沒有太多先例的。

+5

要麼有更高的優先級,沒有先例,但''''具有更高的優先級肯定更有意義。 「(a。b)!不''! (b。c)'有希望通過類型檢查器,但'a。 (b !! c)'和'(a !! b)。 c'都可能是有效的。 – dfeuer

+1

這是有趣的,雖然,'>> ='本來是一個後來除了層次,沒有它會有餘地'.'具有比'低優先級!'。儘管(假設固定性6條目應該提及'++'而不是'++'),我想不出爲什麼'++'應該高於或低於'+'。 – chepner

+0

@dfeuer,哦,這很有趣。這裏可能有一些原則。具有特定返回類型的運算符應該比具有更一般返回類型的運算符更低優先級,或者類似的東西。 – luqui