如何用State Monad与可变Vector实现Alphametics谜题求解?
Alphametics谜题求解程序开发求助
我正在开发Alphametics谜题求解程序,计划采用带记忆化的回溯法,用State Monad结合可变Vector实现。目前算法逻辑已经确定,但在实现字母数字赋值的部分遇到了困难,当前代码存在编译错误,请求帮助解决。
Alphametics谜题说明
Alphametics谜题是将一组单词以竖式加法形式呈现,需要把字母替换成十进制数字,让加法等式成立。示例:
SEND MORE ----- MONEY
唯一解为:
9567 1085 ----- 10652
算法步骤
- 若超出和的最左侧数字:无进位则返回true,否则返回false,同时检查和不能有前置零。
- 若当前处理的是加数,且列索引超出当前行长度:递归处理下一行。
- 若当前是加数中未赋值的字符:遍历所有未使用的数字,尝试赋值后递归,成功则返回true,失败则回溯。
- 若当前是和中的字符:已赋值则检查是否匹配计算结果,未赋值则尝试使用正确数字后递归,失败则回溯。
当前编译错误
• Couldn't match type ‘s’ with ‘primitive-0.7.3.0:Control.Monad.Primitive.PrimState m0’ Expected: MVector (primitive-0.7.3.0:Control.Monad.Primitive.PrimState (ST s)) Int Actual: MVector (primitive-0.7.3.0:Control.Monad.Primitive.PrimState m0) Int ‘s’ is a rigid type variable bound by the type signature for: canSolve :: forall s. Int -> Int -> Int -> M s Bool at src/Alphametics.hs:31:1-41
内容的提问来源于stack exchange,提问作者Abhijit Sarkar
相关产品推荐
相关产品推荐

