Haskell是否进行符号和模式匹配?

问题描述 投票:0回答:1

这是我的代码。

move :: [Char] -> [Char] -> IO ()
move f t = do { putStrLn ("Moving from \"" ++ f ++ "\" to \"" ++ t ++ "\"!") }

hanoi :: Integer -> [Char] -> [Char] -> [Char] -> IO ()
hanoi 0 f _ _ = do { putStrLn ("Lane \""++ f ++ "\" empty!") }
hanoi n f h t = do { hanoi (n - 1) f t h
                   ; move f t
                   ; hanoi (n - 1) h f t } 

当我执行hanoi 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的新手,但仍未完全了解monads ...

haskell pattern-matching towers-of-hanoi io-monad do-notation
1个回答
0
投票

我不知道您的误解在哪里,但是您可能过早地指责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 2hanoi 1hanoi 0

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

[[模式匹配和表示法的某些问题] >>

尽管并非完全无关,但这些概念截然不同。您唯一的模式是0,并且由于do块中的绑定(即[some pattern] <- move),您没有任何模式。

© www.soinside.com 2019 - 2024. All rights reserved.