【发布时间】:2020-11-20 12:54:41
【问题描述】:
Haskell 中的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 作为(<>)。
我们可以看看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 的第一个类型参数进行比较。
【问题讨论】:
-
获取最小项(arg),根据某个属性,而不是元素本身。
-
几个月前我也有同样的问题,但很难找到好的例子。自 (gitlab.haskell.org/ghc/ghc/-/merge_requests/2911, gitlab.haskell.org/ghc/ghc/-/merge_requests/2950) 以来,黑线鳕得到了改进,但我相信它们可以进一步改进。
-
那些类型的同义词没有用。如果
Arg的文档不足,应该展开。
标签: haskell monoids argmax semigroup type-synonyms