[英]Mutable variable and case statement in Haskell
因此,我不確定我想要的實際上是否是可變變量,但這與它類似。
我本質上是想這樣做:
case thing of
True -> p <- func
False -> p <- otherFunc
return Record {program=p, otherFields=oF}
我有什么辦法可以做這樣的事情嗎? 我已經使函數返回了IO記錄,因此嘗試僅將return放入case語句中,但是我的最后一行需要返回它,而事實並非如此。
您只需要移動發生這種case
:
p <- case thing of
True -> func
False -> otherFunc
return $ Record {program=p, otherFields=oF}
但這是假設func
和otherFunc
具有相同的類型,即IO Program
,其中Program
是p
任何類型。
您必須這樣做,因為語法(或多或少)被定義為
case <expr> of
<pattern1> -> <expr1>
<pattern2> -> <expr2>
...
<patternN> -> <exprN>
但是,語法<pattern> <- <expr>
本身並不是表達式,您不能僅使用<-
語法綁定名稱來獲取完整的表達式,然后必須對其進行處理。 可以將表達式視為可以返回任何值的值。 <-
語法沒有返回值,它是從monadic上下文中提取值並將其分配給名稱。 這類似於let x = y
沒有返回值,只是將值綁定到名稱。 x
和y
本身具有返回值,但let x = y
沒有。
這就是為什么您不能僅將p <- func
本身放在case分支中,而必須將其包含其他內容。 但是,如果您的總體案例表達式具有類似IO Program
的返回值,則可以使用<-
提取該表達式 。
幾乎所有這些都用於let
綁定。 如果相反,您的func
和otherFunc
函數的類型為Program
,而不是IO Program
,則您可以執行
let p = case thing of
True -> func
False -> otherFunc
in Record {program=p, otherFields=oF}
或更簡潔
Record {program=(if thing then func else otherFunc), otherFields=oF}
您還可以將if-then-else
與monadic綁定一起使用:
do
p <- if thing then func else otherFunc
return $ Record {program=p, otherFields=oF}
對!
let p = case thing of
...
return ...
這是do
表示法中的語法糖(本身是語法糖),用於
let p = case thing of
...
in do
...
return ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.