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

bestMove :: Board -> (Int,Int)
bestMove brd = minimumBy (comparing $ length.choices brd) (remaining brd)

基本上,bestMove是一个从剩余动作中留下最少量选择的动作。 但我知道没有任何元素留下少于一个选择。 如果找到这样的移动,如何编写此函数以终止搜索最小值?
换句话说,我想要一个返回最小或第一个遇到的元素的函数,该元素足够小(不遍历列表的其余部分)。

这是我的第一个Haskell程序,所以它可能非常基础。 它是一个回溯求解器,所以不要在一个被称为数百万次的函数中遍历整个列表是很重要的。

===============>>#1 票数: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

这是函数式编程中的常见模式:组合简单的解决方案来解决复杂的问题。

  ask by Piotr Lopusiewicz translate from so

未解决问题?本站智能推荐:

5回复

如何在元组列表中找到所有最小元素?

如何找到列表中的所有最小元素? 现在我有一个元组列表,即 因此,我希望输出是新列表中列表的所有最小元素。 例如 我试过了 但这只会返回第一个最小元素。
2回复

如何使用foldr(或foldMap)实现最小值?

我想用foldr或foldMap实现minimum。 根据这个练习,它应该有这个定义: 这听起来非常简单,但我不知道下面的X可以替代X以使其工作。 请帮忙? 你得到奖励积分,告诉我如何使用foldMap,但这似乎更难。
4回复

Haskell中的最小值(不包括0)

我将元组列表,例如[(45.4,[9.0]),(0,[9.1])]传递到将获得最小的元组的函数中 这是我到目前为止的代码 我可以在没有x> 0的情况下使用该函数,但该函数将正常工作,但是当我尝试使用> 0进行比较时,它将不起作用。 修复我在比较之前删除了0,并且我
1回复

如何找到最小范围

我有一个Java Map: 基本上,此地图包含: 现在,我想找到所有单词位置之间的最小范围。 我们将拥有唯一且经过排序的位置(即,没有两个整数将是相同的)。 我们应该如何解决这个问题? 但是我不知道如何用Java处理。 有人可以帮我吗? 如果您有其他不同的方
4回复

获取列表的最小值

我试图找到列表的最小值(作为一种学习经验,所以没有min )。 我的方法如下: 这给了我以下错误: 语法错误:应为运算符 所以我的问题是: 是什么导致语法错误? 如果它确实可以返回正确的值,那么一旦修复后,我将自己尝试一下,但这实际上是正确的方法
2回复

查找元组中最小元素的最大值

如果我有清单 如何查找具有最大最小元素的子列表? 也就是说,在上述情况下,它的索引为[3] - [75,156]因为它的最小值大于所有其他元素的最小值。
5回复

Java:递归查找列表中的最小元素

我将以说这是家庭作业为开头。 我只是在寻找一些指示。 我一直在为这个而绞尽脑汁,对于我的一生,我只是不明白。 我们被要求在列表中找到最小的元素。 我知道我在这里需要一个子列表,但是之后我不确定。 任何指针都很棒。 谢谢。
2回复

问题获取列表/数组的最小值

我有一个奇怪的问题,至少我无法解释这种行为的原因。 我使用下面定义的函数rand_data生成一个随机值列表。 当我尝试使用min()函数提取最小值时,它将返回整个列表,这使我相信它不是列表,而是数组 。 但是,如果我尝试使用.min()属性,它将返回错误: 这是怎么回事
13回复

Prolog,在列表中找到最小值

简而言之:如何在列表中找到最小值? (感谢kaarel的建议) 很长的故事: 我在amzi prolog中创建了一个加权图并给出了2个节点,我能够检索路径列表。 但是,我需要在此路径中找到最小值,但无法遍历列表以执行此操作。 我可以请您就如何确定清单中的最小值寻求建议吗?
1回复

Spark reducebykey-最小列表元素

我在使用Spark reduceByKey / groupByKey函数时遇到问题。 我有一对RDD,格式为(datetime, [a1, b1, c1, d1]), (datetime, [a2, b2, c2, d2]) ... 我想通过键(在这里相同的日期时间)对那些元素进行分