Haskell: let statement, copy data type to itself with/without modification not working

前端 未结 3 426
傲寒
傲寒 2021-01-16 05:35

I want to update a record syntax with a change in one field so i did something like:

let rec = rec{field = 1}

But I\'ve noticed that i can\

3条回答
  •  悲哀的现实
    2021-01-16 06:32

    First of all, Haskell does not allow "copying" data to itself, which in the normal sense, means the data is mutable. In Haskell you don't have mutable "variable"s, so you will not be able to modify the value a given variable presents.

    All you have did, is define a new variable which have the same name of its previous version. But, to do this properly, you have to refer to the old variable, not the newly defined one. So your original definition

    let rec = rec { field=1 }
    

    is a recursive definition, the name rec refer to itself. But what you intended to do, is to refer to the rec defined early on.

    So this is a name conflict.

    Haskell have some machenism to work around this. One is your "temporary renaming".

    For the original example this looks like

    let rec' = rec
    let rec = rec' { field=1 }
    

    This looks like your given solution. But remember this is only available in a command line environment. If you try to use this in a function, you may have to write

    let rec' = rec in let rec = rec' { field=1 } in ...
    

    Here is another workaround, which might be useful when rec is belong to another module (say "MyModule"):

    let rec = MyModule.rec { field=1 }
    

提交回复
热议问题