簡體   English   中英

Haskell:(++)和(:)運算符的評估順序

[英]Haskell: Order of evaluation for (++) and (:) operators

我有以下Haskell表達式:

3 : [40] ++ [50] ++ 5 : [60]

我想知道如何評估這個表達式。 哪個運算符具有更高的優先級:或者++ 我認為表達式的結果是[3,40,50,5,60],但是我這樣做的方式如下:

3 : [40] ++ [50] ++ 5 : [60]
3 : [40] ++ [50] ++ [5,60]
3 : [40] ++ [50,5,60]
3: [40,50,5,60]
[3,40,50,5,60]

以上是評估表達式的正確方法嗎? 任何見解都表示贊賞。

(++) :: [a] -> [a] -> [a](:) :: a -> [a] -> [a]函數都有5 優先級 ,我們可以在Haskell '10報告 ,並且是正確的關聯。

我們也可以使用以下命令獲取此數據:ighci shell中:

Prelude> :i (:)
data [] a = ... | a : [a]       -- Defined in ‘GHC.Types’
infixr 5 :
Prelude> :i (++)
(++) :: [a] -> [a] -> [a]       -- Defined in ‘GHC.Base’
infixr 5 ++

這意味着:

3 : [40] ++ [50] ++ 5 : [60]

是短的:

3 : ([40] ++ ([50] ++ (5 : [60])))

(++)運算符實現為

 (++) :: [a] -> [a] -> [a] (++) [] ys = ys (++) (x:xs) ys = x : xs ++ ys 

(:)是一個數據構造函數,因此意味着它無法“進一步評估”。

這是有道理的,因為它意味着++只在這里應用於尾部,因此只要我們對頭部感興趣,我們就不需要評估該函數。 因此,右關聯(++)通常比左關聯(++)便宜,盡管它會產生相同的列表。

如果我們想要評估完整列表,則將其評估為:

   3 : ([40] ++ ([50] ++ (5 : [60])))
-> 3 : (40 : ([] ++ ([50] ++ (5 : [60]))))
-> 3 : (40 : ([50] ++ (5 : [60])))
-> 3 : (40 : (50 : ([] ++ (5 : [60]))))
-> 3 : (40 : (50 : (5 : [60])))

或者更詳細:

   3 : ((40: []) ++ ((50 : []) ++ (5 : (60 : []))))
-> 3 : (40 : ([] ++ ((50 : []) ++ (5 : (60 : [])))))
-> 3 : (40 : ((50 : []) ++ (5 : (60 : []))))
-> 3 : (40 : (50 : ([] ++ (5 : (60 : [])))))
-> 3 : (40 : (50 : (5 : (60 : []))))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM