我正在为简单的棋盘游戏编写Haskell求解器。我有这个功能:
bestMove :: Board -> (Int,Int)
bestMove brd = minimumBy (comparing $ length.choices brd) (remaining brd)
基本上,bestMove是一项从剩余动作中留下最少量选择的动作。但我知道没有任何元素留下少于一个选择。如果找到这样的移动,如何编写此函数以终止搜索最小值? 换句话说,我想要一个返回最小或第一个遇到的元素的函数,该元素足够小(不遍历列表的其余部分)。
这是我的第一个Haskell程序,所以它可能非常基础。它是一个回溯求解器,所以不要在一个被称为数百万次的函数中遍历整个列表是很重要的。
答案 0 :(得分:3)
我会简化您的问题,因为您没有为某些功能提供类型:
如果给出一个已知的最小值下限,你如何编写一个函数来取一个列表的最小值?
这样的函数会有类型:
minimum' :: (Ord a) => a -> [a] -> a
...其中第一个参数是已知下限(即1个选项),第二个参数是要搜索的列表。
我们可以通过组合两个更简单的函数来定义这个函数。第一个函数只是懒惰地从列表中获取所有元素,直到它到达列表的下限或末尾:
chop :: (Ord a) => a -> [a] -> [a]
chop minElem as =
let (prefix, suffix) = span (> minElem) as
in case suffix of
[] -> prefix
s:uffix -> prefix ++ [s]
然后我们用最少的东西组成:
minimum' minElem = minimum . chop minElem
这是函数式编程中的一种常见模式:构成解决复杂问题的简单解决方案。