haskell - Data.Semigroup 中的 ArgMin 和 ArgMax 类型同义词的用途是什么?

标签 haskell monoids argmax semigroup type-synonyms

base Haskell 中的库在 Data.Semigroup 中具有以下类型同义词:

type ArgMin a b = Min (Arg a b)

type ArgMax a b = Max (Arg a b) 
以下是黑线鳕的链接: ArgMin ArgMax
这两种类型的同义词的目的是什么?它们可以在哪里有效使用?
解释一下 argmin 和 argmax 函数在数学中的作用以及它们与这些类型同义词的关系可能会有所帮助。

这里有一些额外的信息,所以你不必跳到 Hackage。
这是 Arg 的定义:
-- | 'Arg' isn't itself a 'Semigroup' in its own right, but it can be
-- placed inside 'Min' and 'Max' to compute an arg min or arg max.
data Arg a b = Arg a b
它的文档字符串表明 ArgMinArgMax可以放在Min里面和 Max计算 arg min 或 arg max。
Min Max如下所示:
newtype Min a = Min { getMin :: a }
Semigroup实例很有趣:
instance Ord a => Semigroup (Min a) where
  (<>) = coerce (min :: a -> a -> a)
看起来它正在使用 min(<>) .
大家可以看一下Ord实例看起来像 Arg ,因为它在这里是相关的:
instance Ord a => Ord (Arg a b) where
  Arg a _ `compare` Arg b _ = compare a b
  min x@(Arg a _) y@(Arg b _)
    | a <= b    = x
    | otherwise = y
  max x@(Arg a _) y@(Arg b _)
    | a >= b    = x
    | otherwise = y
这似乎只对 Arg 的第一个类型参数进行比较。 .

最佳答案

我想这是 Haskell 中存在的那些东西之一,因为存在理论概念。我不确定这些类型是否有很多实际用途,但它们确实说明了半群和幺半群的概念在编程方面的广泛性。
例如,假设您需要选择两个名字中最长的一个,name1name2 , 他们都是String值(value)观。您可以使用 Semigroup ArgMax 的实例为了那个原因:

Prelude Data.Semigroup> Max (Arg (length name1) name1) <> Max (Arg (length name2) name2)
Max {getMax = Arg 5 "Alice"}
之后,这只是一个打开 "Alice" 的问题。从它的容器中。
正如 Willem Van Onsem 在评论中指出的那样,您可以使用 ArgMaxArgMin根据项目的某些属性选择最大或最小项目,但仍保留原始项目。

关于haskell - Data.Semigroup 中的 ArgMin 和 ArgMax 类型同义词的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64929877/

相关文章:

list - 模式匹配如何与列表一起使用

scala - 如何使用 Monoid Scala?

python - 2D 矩阵中特定轴上的 Numpy.argmax()

haskell - `foldl`的实际使用

scala - Haskell GHCi 打印惰性序列,但 Scala REPL 不打印

haskell - 在 Haskell 中使用 Maybe 写一个最大 Monoid

Scala PartialFunction 可以是 Monoid 吗?

pandas - 查找每行具有最大值的列索引

python - 如何查找ndarray中的所有argmax

performance - 为什么将函数移到另一个模块时性能会下降?