我最近遇到了以下代码,这让我很困扰
lowerSafeForeignCall dflags block
| (entry, middle, CmmForeignCall { .. }) <- blockSplit block
= do
-- do block stuffs
-- Block doesn't end in a safe foreign call:
| otherwise = return block
这段代码来自 https://phabricator.haskell.org/rGHCb0534f78a73f972e279eed4447a5687bd6a8308e
在文件 compiler/cmm/CmmLayoutStack.hs
第 983 行
我真的很想知道第二行中这是什么<-。我相信lowerSafeForeignCall是一个函数,而| 和“否则”表示此函数使用警卫。所以
(entry, middle, CmmForeignCall { .. }) <- blockSplit block
必须是 Bool 类型。但是 <- 在任何 do 块之外。我在网上做了一些搜索,但仍然没有关于这种用法的任何线索。