Haskell做符号和模式匹配吗?

Haskell做符号和模式匹配吗?,haskell,pattern-matching,towers-of-hanoi,io-monad,do-notation,Haskell,Pattern Matching,Towers Of Hanoi,Io Monad,Do Notation,这是我的代码 move::[Char]->[Char]->IO() 移动f t=do{putStrLn(“从\++f++“\”移动到\++t++“\”!”) 河内::整数->[Char]->[Char]->[Char]->[Char]->IO() 河内0 f{uuuuu=do{putStrLn(“车道”++f++“\”空!”) 河内n f h t=do{hanoi(n-1)f t h ;移动f t ;河内(n-1)hft} 当我执行河内4“A”“B”“C”时,我预期会出现如下情况: Movin

这是我的代码

move::[Char]->[Char]->IO()
移动f t=do{putStrLn(“从\++f++“\”移动到\++t++“\”!”)
河内::整数->[Char]->[Char]->[Char]->[Char]->IO()
河内0 f{uuuuu=do{putStrLn(“车道”++f++“\”空!”)
河内n f h t=do{hanoi(n-1)f t h
;移动f t
;河内(n-1)hft}
当我执行河内4“A”“B”“C”时,我预期会出现如下情况:

Moving from "A" to "B"!
Moving from "A" to "C"!
Moving from "B" to "C"!
Moving from "A" to "B"!
Moving from "C" to "A"!
Moving from "C" to "B"!
Moving from "A" to "B"!
Tower "A" empty!
...
但我得到了:

Tower "A" empty!
Moving from "A" to "B"!
Tower "C" empty!
Moving from "A" to "C"!
Tower "B" empty!
Moving from "B" to "C"!
Tower "A" empty!
Moving from "A" to "B"!
Tower "C" empty!
Moving from "C" to "A"!
Tower "B" empty!
Moving from "C" to "B"!
...
在我看来,模式匹配和do表示法存在一些问题,我不知道是什么。 有人能给我解释一下我做错了什么,或者我没有理解到这一点,我想这与IO monad的异步执行有关


我是哈斯凯尔的新手,还没有完全弄明白蒙纳德…

我不知道你的误解在哪里,但你可能很快就把责任推到了蒙纳德妖怪身上。在Haskell中通过该程序进行跟踪似乎与通过相当直接的C对应程序进行跟踪完全相同,其结果与您所展示的相同:

// move :: [Char] -> [Char] -> IO ()
void move(char *f, char *t)
{
    // move f t = do { putStrLn ("Moving from \"" ++ f ++ "\" to \"" ++ t ++ "\"!") }
    printf("Moving from \"%s\" to \"%s\"!\n", f, t);
}

// hanoi :: Integer -> [Char] -> [Char] -> [Char] -> IO ()
void hanoi(int64_t n, char *f, char *h, char *t)
{
    if (0 == n) {
        // hanoi 0 f _ _ = do { putStrLn ("Lane \""++ f ++ "\" empty!") }
        printf("Lane \"%s\" empty!\n", f);
    } else {
        // hanoi n f h t =
        hanoi(n-1,f,t,h); // hanoi (n - 1) f t h
        move(f,t);        // move f t
        hanoi(n-1,h,f,t); // hanoi (n - 1) h f t
    }
}

int main()
{
    hanoi(4,"A","B","C");
    return 0;
}
想想发生了什么。你说的
hanoi 4…
,下一行有意义的代码是
hanoi(4-1)…
,正如@user2407038已经评论过的,后面将是
hanoi 2
hanoi 1
hanoi 0

我认为你应该更仔细地考虑你的算法。

模式匹配和do表示法[存在一些问题]


虽然并非完全无关,但这些概念是相当不同的。您仅有的模式是
0
,由于do块中的绑定,您没有任何模式(即
[某些模式]“IO monad的异步执行”没有问题(我假设您指的是惰性流上的输出交错-这没有发生)或者单子的任何其他问题。事实上,您的程序是正确的。每次调用
hanoin…
对于每个正的
n
将首先调用
hanoi(n-1)
,然后再做其他事情-这显然是根据
hanoin
的定义,因为它的第一个语句是
hanoi(n-1)
。根据归纳法,每次调用
河内n
都会在执行任何其他操作之前调用
河内0
。因此,每行前面都有“Tower..empty”!谢谢,您的解释非常有帮助!您应该查看前面的注释。我明白了。也谢谢您。