0
我有一个程序,我正尝试创建一行文本编辑器 在这一点上,我已经走到了一堵墙。 我有一个list
字母left
和一个right
也许在一个函数或做的列表中,我怎样才能将左边设置为left ++ char
其中char是用户输入的字符。我知道无法修改列表,但我可以重新定义它们吗? 如果这个伪代码可以帮助提前设置变量为相同的变量修改?
我有一个程序,我正尝试创建一行文本编辑器 在这一点上,我已经走到了一堵墙。 我有一个list
字母left
和一个right
也许在一个函数或做的列表中,我怎样才能将左边设置为left ++ char
其中char是用户输入的字符。我知道无法修改列表,但我可以重新定义它们吗? 如果这个伪代码可以帮助提前设置变量为相同的变量修改?
这就是State Monad是
left = "hello"
in = get user input
left = left ++ in
感谢。链接应该有帮助(它指向一个教程)。你的例子会变成:
type Line = State String()
addInput :: String -> Line
addInput inp = do
left <- get
put $ left ++ inp
runState (addInput <user input>) "hello"
但是,这确实需要了解单子。按照链接中的示例进行操作。
我认为可以将其缩短为'addInput inp = modify(++ inp)'。 – leftaroundabout
是的,有点儿,你可以“影子”。但是,就好像新的绑定与旧的绑定完全分离 - 你不能对任何影子进行任何操作,而只是使用不同的名称作为新的定义。 – luqui
“修改”和“重新定义”有什么区别?一旦变量被绑定到一个值,那就不能再改变了。但是你可以定义一个新变量来获得新的值 - 新变量甚至可以和旧变量名称相同,但它仍然是一个新变量。 – chi
好吧,你可以用'let left =“new”+“value”''来给'left'添加阴影,但是'let left = left ++ in'会创建'left'的递归定义;它不会创建一个新的'left',它的值是'left'与'in'结合的旧值。 – chepner