问题描述
完全不熟悉 Haskell,我希望得到一些帮助。
在 Prolog 中实现谓词,这些谓词利用一些减少解决方案空间的约束,从而使整体实现不是天真的/蛮力实现是非常容易的。但是,现在我必须与 Haskell 打交道,我不知道该怎么做。
鉴于在某个时刻P1我做出选择说A1并且在稍后的时间点P2我做出选择说A2 不遵守我的约束,我如何回到 P1 并在 Haskell 中做出不同的选择?
我现在学习了 Haskell 2 天,从我读到的内容来看,这可能是可行的,方法是在函数中声明一个函数,或者使用我不太理解并使我感到困惑的 monad。
您能否将我链接到/向我展示一些简单的选择它 - 将其置于约束之下 谓词,这些谓词使用回溯 - 最好没有单子 - 所以我可以围绕它?
解决方法
当然,这是一个简单的选择一个数字,然后如果它发现数字不是偶数,它会备份并选择另一个。
searchForEven :: [Int] -> [Int]
searchForEven ns = [n | n <- ns,even n]
这是一个与您描述的情况相匹配的示例:
鉴于在某个时刻 P1 我做出选择说 A1 并且在稍后的时间点 P2 我做出选择说 A2 不服从我的约束,我怎样才能回到 P1 并做出不同的选择?
>p1 = [1..10]
p2 = [2,3,5,7]
constraint a b = a^2 + b^2 == 5^2
searchForPythagoreanTriple :: [Int]
searchForPythagoreanTriple =
[ (a1,a2)
| a1 <- p1,a2 <- p2,constraint a1 a2
]
我使用了我希望相当具有暗示性的名称来强调示例与您描述的场景之间的联系。
不要害怕单子。看看它在 monad 语法中的相同:
searchForEven ns = do
n <- ns
guard (even n)
pure n
searchForPythagoreanTriple = do
a1 <- p1
a2 <- p2
guard (constraint a1 a2)
pure (a1,a2)