Haskell实现十五数码谜题递归处理String时类型不匹配错误如何修复
问题修复方案
错误原因
你的编译报错来自puzzle函数的参数传递不符合set的类型约定:set函数的类型为set :: [[Char]] -> Char -> [[Char]],第一个入参需要是棋盘(Result类型,即[[Char]]),第二个入参是要移动的字符。你原代码中把字符串类型的移动序列(x:xs)作为set的第一个入参传入,类型完全不匹配,因此触发Couldn't match expected type ‘Char’ with actual type ‘[Char]’报错。
修复代码
你需要实现的逻辑是按顺序将每一步移动作用到上一步生成的新棋盘上,属于典型的左折叠场景,有两种实现方式可选:
递归实现
puzzle :: Result -> [Char] -> Result -- 基准条件:没有待执行的移动,直接返回当前棋盘 puzzle gameboard [] = gameboard -- 递归逻辑:先执行当前字符的移动,用新棋盘递归处理剩余移动序列 puzzle gameboard (x:xs) = puzzle (set gameboard x) xs
函数式折叠实现(更简洁)
直接用Haskell标准库的foldl实现迭代逻辑,一行即可完成:
puzzle :: Result -> [Char] -> Result puzzle = foldl set
效果验证
修复后调用pp(puzzle puzzle2 "CB")即可得到你预期的输出:
ABCDE F HIJ KGLNO PQMRS UVWXT
内容的提问来源于stack exchange,提问作者wybot
相关产品推荐
相关产品推荐

