gpt4 book ai didi

haskell - 左箭头 <- 在 do block 之外是什么意思?

转载 作者:行者123 更新时间:2023-12-04 01:43:47 24 4
gpt4 key购买 nike

我最近遇到了以下代码,这让我很困扰

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 是一个函数,而 |和“否则”表示此功能使用 guard 。所以
(entry, middle, CmmForeignCall { .. }) <- blockSplit block

必须是 Bool 类型。但是 <- 在任何 do block 之外。
我在网上做了一些搜索,但仍然没有关于这种用法的任何线索。

最佳答案

那是 pattern guard :

guard       →   pat <- infixexp      (pattern guard)


[...]

A guard has one of the following forms:

  • pattern guards are of the form p <- e, where p is a pattern (see Section 3.17) of type t and e is an expression type t. They succeed if the expression e matches the pattern p, and introduce the bindings of the pattern to the environment.

在普通保护仅限于 bool 检查的情况下,模式保护可以匹配任意模式并定义局部变量。 (在您的情况下 entrymiddleCmmForeignCall 的内容将直接在函数体中可用。)
您可以将 bool 值守卫视为等同于模式为 True 的模式守卫。 :
| expr
| True <- expr

关于haskell - 左箭头 <- 在 do block 之外是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56393471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com