Hutton 的“Programming in Haskell”,第一版,說連接運算子 可以定義為:
( ys) = foldr (:) ys
這是合乎邏輯的。
我從來沒有見過一個運算子是由它的一個部分(在這種情況下( ys))上的一個方程定義的,所以我自己嘗試了一下:
(@@) :: [a] -> [a] -> [a]
(@@ ys) = foldr (:) ys
但是,這不會編譯,突出顯示(@@ ys).
這從來都不是一個功能,還是在某個時候被洗掉了?如果是這樣,為什么?
我知道我可以將以上內容寫為:
xs @@ ys = foldr (:) ys xs
但我發現無點風格更優雅。
uj5u.com熱心網友回復:
我認為有一個更簡單的解釋與=系結的 lhs 上允許的語法形式有多復雜有關。
請始終發布您收到的錯誤訊息,不要只說“突出語法錯誤”。該訊息可能對您來說意義不大,但在這種情況下,它給出了一個強烈的提示:
(@@ ys) = ...
===> error: Parse error in pattern: @@ys
(xs @@) = ...
===> error: Expression syntax in pattern: xs @@
“模式”啊哈!也就是說,lhs 可能是一種句法模式。此外,無論您介紹什么,都可能沒有簽名宣告;即使有,編譯器也必須根據簽名檢查您的方程式,因此它不能假設您所介紹的內容的數量。考慮這些有效的方程
z = 42 -- z counts as a pattern
Just z = {- long and complex expr returning a Maybe, binds z at module-wide scope -}
(Just z) = {- same same, binds z at module-wide scope -}
foo x = ... -- foo gets module-wide scope but not x
(foo x) = ... -- same
bar x y = ... -- bar gets module-wide scope but not x, y
(bar x) y = ... -- same
(x ## y) z = ... -- accepted, introduces triadic operator ##
x ## y z = -- rejected error: Parse error in pattern: y
(x ##) y = -- rejected error: Expression syntax in pattern: x ##
(## y) z = -- rejected error: Parse error in pattern: ##y
語言報告(第 4.4.3 節功能和模式系結)有
decl -> (funlhs | pat) rhs
funlhs -> var apat { apat }
| pat varop pat
| ( funlhs ) apat { apat }
所以 lhs 不是可以出現運算式語法(包括運算子部分)的地方。另請參閱第 4.4.3.1 節末尾的丑陋細節,以將 lhs 運算子語法與中綴資料建構式結合使用,呃!
這里的最后一句話也證實了你不能在 lhs 上使用運算子部分。
uj5u.com熱心網友回復:
這將導致一些微妙的不一致。盡管我們傾向于認為 curried、flipped 和 uncurried 函式只是撰寫同一事物的不同方式,但在實際的評估策略中,情況并非如此。考慮
(#>) :: Integer -> Integer -> Integer
(#>) n = let p = {- the `n`-th prime number -} `mod` 74
in (p )
索引質數是昂貴的。如果你寫類似
map ((2^43) #>) [100 .. 150]
那么第 2 43個素數只需要計算一次。相比之下,如果我定義
(<#) :: Integer -> Integer -> Integer
(<#) = flip foo
然后寫作map (<# (2^43)) [100 .. 150]會一遍又一遍地計算素數,因為 Haskell 不支持在第二個引數上部分應用函式。
有了這個flip foo定義,這并不太令人驚訝,但如果我可以直接將翻轉形式定義為
(<#n) = let p = {- the `n`-th prime number -} `mod` 74
in (p )
那么人們可以合理地期望它map (<# (2^43)) 確實共享主要計算,但是為了支持 Haskell 的部分評估語意需要跟蹤比目前更多的資訊,如果我們希望它可靠地作業,那么它可能會帶來一些其他缺點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474022.html
