非递归绑定允许我对绑定值进行阴影处理,例如:
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)