[英]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.