在Haskell中是否存在非递归绑定的语法,就像在类似语言中`let`和`let rec`之间的区别一样?

Jas*_* Hu 4 haskell

非递归绑定允许我对绑定值进行阴影处理,例如:

b a = let norec a = a + 10 in a
Run Code Online (Sandbox Code Playgroud)

这里let norec由我自己创造是指let具有约束力,但不是递归.

使用记录通配符时,这非常有用:

data MyRecord = MyRecord{ {- vary huuuuuge set of definitions -} }

foo MyRecord{..} = let norec field1 = field1 + 1
                             field2 = modify field2
                             {- some other modifications to the fields -}
                    in MyRecord{..}
Run Code Online (Sandbox Code Playgroud)

这可以实现吗?或者你如何在你的情况下处理它?

Dan*_*ner 10

记录通配符实际上在这里有用吗?通常旧的做事方式对我来说非常简洁:

foo r = r { field1 = field1 r + 1, field2 = modify (field2 r) }
Run Code Online (Sandbox Code Playgroud)

你问题的直接答案是letHaskell中没有非递归模拟; 虽然你可以使用Identitymonad来解决某些问题:

foo MyRecord{..} = runIdentity $ do
    field1 <- return (field1 + 1)
    field2 <- return (modify field2)
    return MyRecord{..}
Run Code Online (Sandbox Code Playgroud)