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
它的文档字符串表明 ArgMin
和 ArgMax
可以放在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 中存在的那些东西之一,因为存在理论概念。我不确定这些类型是否有很多实际用途,但它们确实说明了半群和幺半群的概念在编程方面的广泛性。
例如,假设您需要选择两个名字中最长的一个,name1
和 name2
, 他们都是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 在评论中指出的那样,您可以使用
ArgMax
和 ArgMin
根据项目的某些属性选择最大或最小项目,但仍保留原始项目。
关于haskell - Data.Semigroup 中的 ArgMin 和 ArgMax 类型同义词的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64929877/