在haskell中实现最大值

时间:2016-07-27 18:31:12

标签: haskell

我只是在查看haskell中最大函数的实现:

maximum :: forall a . Ord a => t a -> a
maximum = fromMaybe (errorWithoutStackTrace "maximum: empty structure") .
   getMax . foldMap (Max #. (Just :: a -> Maybe a))

有人可以向我解释这段代码吗?

特别是我不清楚这部分是如何的

Max #. (Just :: a -> Maybe a)

的工作原理。什么#。意思?对我来说,它看起来像功能组合,但输入

:t #. 
REPL中的

给出错误。 另外我认为foldMap的参数应该是

形式
Monoid m => a -> m

但我无法看到幺半群结构来自何处。

1 个答案:

答案 0 :(得分:4)

#.是一个可以使强制更容易使用的运算符。

f #. g

装置

  

g,强制使用f . g

类型

类似地,

f .# g

装置

  

f,强制使用f . g

类型

在大多数情况下,f #. g只有在f是newtype构造函数,newtype访问器和fmap的某种组合时才有意义。

在我#.中使用maximum的原因可能是我过分热心。几乎可以肯定地用.替换它没有任何问题。