2016-01-13 103 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