2017-04-26 68 views
0

我有一个程序,我正尝试创建一行文本编辑器 在这一点上,我已经走到了一堵墙。 我有一个list字母left和一个right 也许在一个函数或做的列表中,我怎样才能将左边设置为left ++ char其中char是用户输入的字符。我知道无法修改列表,但我可以重新定义它们吗? 如果这个伪代码可以帮助提前设置变量为相同的变量修改?

+3

是的,有点儿,你可以“影子”。但是,就好像新的绑定与旧的绑定完全分离 - 你不能对任何影子进行任何操作,而只是使用不同的名称作为新的定义。 – luqui

+0

“修改”和“重新定义”有什么区别?一旦变量被绑定到一个值,那就不能再改变了。但是你可以定义一个新变量来获得新的值 - 新变量甚至可以和旧变量名称相同,但它仍然是一个新变量。 – chi

+0

好吧,你可以用'let left =“new”+“value”''来给'left'添加阴影,但是'let left = left ++ in'会创建'left'的递归定义;它不会创建一个新的'left',它的值是'left'与'in'结合的旧值。 – chepner

回答

2

这就是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" 

但是,这确实需要了解单子。按照链接中的示例进行操作。

+0

我认为可以将其缩短为'addInput inp = modify(++ inp)'。 – leftaroundabout