base
库在 Data.Semigroup
中有以下类型同义词:type ArgMin a b = Min (Arg a b)
type ArgMax a b = Max (Arg a b)
这两个类型同义词的目的是什么?它们在哪些场景中可以有效使用?
可能有助于解释数学中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
作为 (<>)
。
我们可以查看 Arg
的 Ord
实例是什么样的,因为这在这里是相关的:
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
的比较。
Arg
的文档不足,应该进行扩展。 - dfeuer