簡體   English   中英

'@' 在 Haskell 中是什么意思?

[英]What does '@' mean in Haskell?

我試過谷歌搜索,但結果很短。 我通過閱讀一些文章來進一步加深我的 Haskell 知識,我遇到了一篇使用我以前從未見過的語法的文章。 一個例子是:

reconstruct node@(Node a b c l r) parent@(Node b d le ri)

我以前從未見過這些@。 我嘗試在網上搜索答案,但結果很短。 這只是一種嵌入標簽以幫助使事情更清晰的方法,還是它們對代碼有實際影響?

它用於模式匹配。 現在node變量將引用參數Node abclr的整個Node數據類型。 因此,不是作為Node abclr傳遞給函數,您可以使用node來傳遞它。

一個更簡單的例子來演示它:

data SomeType = Leaf Int Int Int | Nil deriving Show

someFunction :: SomeType -> SomeType
someFunction leaf@(Leaf _ _ _) = leaf
someFunction Nil = Leaf 0 0 0

someFunction也可以寫成:

someFunction :: SomeType -> SomeType
someFunction (Leaf x y z) = Leaf x y z
someFunction Nil = Leaf 0 0 0

看看第一個版本有多簡單?

除了@Sibi 的答案中描述的參數模式匹配用法之外,在 Haskell 中,“at”字符('@',也稱為arobase字符)可以在某些上下文中用於強制輸入決定。 @Josh.F 在評論中提到了這一點。

不是默認語言功能的一部分,被稱為Type Application Haskell 語言擴展。 總之,該擴展允許您為多態函數(例如read提供顯式類型參數。 在經典的 .hs 源文件中,必須包含相關的編譯指示:

{-#  LANGUAGE TypeApplications  #-}

例子:

$ ghci
GHCi, version 8.2.2: http://www.haskell.org/ghc/  :? for help
 λ> 
 λ> let x = (read @Integer "33")

 <interactive>:4:10: error:
    Pattern syntax in expression context: read@Integer
    Did you mean to enable TypeApplications?
 λ> 
 λ> :set -XTypeApplications
 λ>
 λ> let x = (read @Integer "33")
 λ>
 λ> :t x
 x :: Integer
 λ> 
 λ> x
 33
 λ> 

暫無
暫無

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

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