2016-01-13 107 views
1

我想在Haskell的函数中执行几条语句, 我在网上看了一下,并得到了如果我使用“do”的想法,我可以做到这一点我使用过它,但它仍然不适合我,如果有人可以请看看并指导我做错了什么,我刚开始使用haskell,所以它与Haskell语法有点纠结。在同一个函数中执行多个命令(Haskell)

我的功能:

type Rod = String 
Move = (Integer, Rod, Rod) 
hanoi :: Integer -> Rod -> Rod -> Rod -> [Move] 
hanoi n source helper destination= if n==1 then [(n source destination)] else do 
           (hanoi (n-1) source helper destination) 
           ([n source destination]) 
           (hanoi (n-1) helper destination source) 

我试图做汉诺塔的问题;我要执行的三句话,是经过“做”。任何帮助将不胜感激。

在此先感谢!

+4

Haskell是一种面向表达式的语言。一个'='(或者表达式的' - >'的RHS上的所有内容都是一个表达式.'do'块是一种奇特的表达式,但不适合这种用例。对于你的情况,你真的应该考虑什么*结果*需要。然后写一个描述它的表达式。 – Carl

+3

我认为你非常接近 - 你只需要意识到你不想*做*某件事 - 事实上你试图返回一个“列表”动作 - 你必须以某种方式* concat *结果)。 ......对于落后者也是如此:对你感到羞耻 - 这是一个很好的问题 - 也许不是博士水平,但请保持社区对初学者友好! – Carsten

+1

@Carsten感谢您这样甜蜜,善良和激励的评论,我会尽量想到将结果拼接起来。我很高兴听到我有些接近解决方案:)再次感谢!!!! – Nia

回答

7

帮助你在这里有点是一种方式来获得它来编译和工作(以及几乎):

type Rod = String 
type Move = (Integer, Rod, Rod) 

hanoi :: Integer -> Rod -> Rod -> Rod -> [Move] 
hanoi n source helper destination = 
    if n==1 then 
    [(n, source, destination)] 
    else 
    hanoi (n-1) source helper destination 
    ++ [(n, source, destination)] 
    ++ hanoi (n-1) helper destination source 

我改变的事情是:

  • 给了一个类型Move (我希望你想要一个元组)
  • 改成果转化为元组((n source destination) -> (n,source,destination)
  • 连接在一起的结果与++

现在你只需要修复与操作的顺序,一个小问题)和它应打印您的解决方案:d

+1

非常感谢你,这确实是我一直在努力的。感谢您如此善良,乐于助人!!!!! :) – Nia