Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 最小的或足够小的_List_Haskell_Minimum - Fatal编程技术网

List 最小的或足够小的

List 最小的或足够小的,list,haskell,minimum,List,Haskell,Minimum,我正在为简单的棋盘游戏编写Haskell解算器。我有这个功能: bestMove :: Board -> (Int,Int) bestMove brd = minimumBy (comparing $ length.choices brd) (remaining brd) 基本上,bestMove是一种在剩下的招式中保留最少选择的招式。然而,我知道没有一个元素会留下少于一个选择。如果发现这样的移动,如何编写此函数以终止搜索最小值? 换句话说,我想要一个函数,它返回足够小的最小或第一个遇到

我正在为简单的棋盘游戏编写Haskell解算器。我有这个功能:

bestMove :: Board -> (Int,Int)
bestMove brd = minimumBy (comparing $ length.choices brd) (remaining brd)
基本上,bestMove是一种在剩下的招式中保留最少选择的招式。然而,我知道没有一个元素会留下少于一个选择。如果发现这样的移动,如何编写此函数以终止搜索最小值?
换句话说,我想要一个函数,它返回足够小的最小或第一个遇到的元素(不遍历列表的其余部分)


这是我的第一个Haskell程序,所以它可能非常基本。这是一个回溯解算器,因此在调用数百万次的函数中不遍历整个列表非常重要。

我将简化您的问题,因为您没有为某些函数提供类型:

如果已知最小值的下限,如何编写函数来获取列表的最小值

此类函数将具有以下类型:

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
这是函数式编程中的一种常见模式:编写简单的解决方案来解决复杂的问题