我是 Haskell 的新手;只是為了一個專案,我應該了解源代碼:我一直在查看 Udemy 課程,“Learn you a Haskell”等,但目前仍在苦苦掙扎: 代碼片段用于報告錯誤。
我想知道“命名指令”代表什么,以及代碼片段的作用:
maybeReportBug :: Named Instruction -> Int -> Checker Uninits UninitBug ()
maybeReportBug ni lineno = do
s0 <- getState
let allTainted = tainted s0
allFields = bitfields s0
unless (null allTainted) $ do
let names = catMaybes $ map nameOf $ getOperands ni
在哪里:
blankUninit :: Uninits
blankUninit = Uninits S.empty M.empty S.empty
data Uninits = Uninits { uninits :: S.Set Name
, tainted :: M.Map Operand (S.Set Name)
, bitfields :: S.Set Name
}
deriving (Eq, Ord, Show)
以及在哪里
getState :: Checker a b a
getState = curState `liftM` get
以及在哪里
newtype Checker a b c = Checker { unChecker :: StateT (CheckerState a b) IO c }
deriving (Functor, Applicative, Monad, MonadState (CheckerState a b), MonadIO)
uj5u.com熱心網友回復:
讓我試著回答一下標題中提出的問題——你試圖理解的代碼對于初學者來說非常復雜,而 Haskell 與你之前見過的任何編程語言都非常不同。
$- 這是優先運算子。
Haskell 中的決議器從左到右決議代碼。所以,如果我想列印一個階乘:
print factorial 6
Haskell 如何理解這一點?Haskell 以 開頭print,然后查找要列印的引數。Haskell 讀取factorial但不知道如何列印其中一個并發出錯誤訊息。
我們應該在 . 周圍加上括號factorial 6。這會作業,但有點難看。
print (factorial 6)
相反,我們可以使用$(不要與 <$> 混淆,它是一個縮寫fmap并且非常不同)。所做的是$將左側推遲到右側完成。所以我們可以說:
print $ factorial 6.
現在 Haskell 將等到階乘 6 完成后再嘗試列印它。它看起來比很多括號要好。
do- 單子加糖
您需要了解的是,Haskell 實際運行的代碼與您輸入的代碼非常不同。
如果您有串列,則可以使用>>=運算子提取內容。這為我提供了可以處理的原始資料,例如將資料乘以 2,然后再將其轉換回帶有return.
[1,2,3] >>= (\x -> return $ 2*x)
這是可行的代碼,但很難看。
Haskell 的所有代碼都是這樣的,你可以告訴 Haskell 向你展示這些東西。但是,大多數時候我們很高興沒有看到這一點。因此,我們sugar撰寫代碼,也就是說,我們找到了一種更簡單的方式來表達我們想說的話,并讓 Haskell 弄清楚:
main = do
putStr "What is your name: "
name <- readLine
putStrLn $ "Hello " name
這相當于這個脫糖等價物:
main =
putStr "What is your name: " >>
getLine >>= (\name ->
putStrLn $ "Hello " name)
第一個看起來像 Python,第二個更令人困惑——如果代碼繼續下去,有分支,去糖版本變得越來越難以撰寫和維護。
unless- 做決定
在 Haskell 中有很多做決定的方法,其中兩種是when和unless。
兩者都將布林值作為第一個引數。不同之處在于,when當值為 True 時unless執行某些操作,而當值為 False 時執行某些操作。不像if .. then .. else,when并且unless不需要決策的兩個分支。
import Control.Monad
main = do
when True $ putStrLn "True"
unless False $ putStrLn "False"
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517137.html
標籤:哈斯克尔
