簡體   English   中英

Haskell中的可變變量和case語句

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

但這是假設funcotherFunc具有相同的類型,即IO Program ,其中Programp任何類型。

您必須這樣做,因為語法(或多或少)被定義為

case <expr> of
    <pattern1> -> <expr1>
    <pattern2> -> <expr2>
    ...
    <patternN> -> <exprN>

但是,語法<pattern> <- <expr>本身並不是表達式,您不能僅使用<-語法綁定名稱來獲取完整的表達式,然后必須對其進行處理。 可以將表達式視為可以返回任何值的值。 <-語法沒有返回值,它是從monadic上下文中提取值並將其分配給名稱。 這類似於let x = y沒有返回值,只是將值綁定到名稱。 xy本身具有返回值,但let x = y沒有。

這就是為什么您不能僅將p <- func 本身放在case分支中,而必須將其包含其他內容。 但是,如果您的總體案例表達式具有類似IO Program的返回值,則可以使用<-提取該表達式

幾乎所有這些都用於let綁定。 如果相反,您的funcotherFunc函數的類型為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM