如何使用"Haskell"中的"Of"镜头?

4

我想写:

minimum $ map _x elems

使用镜头。我想要使用minimumOf镜头,但是我无法从它的类型中找出如何使用它。
我正在寻找类似于以下内容:
elems ^.. minimumOf x

但它不进行类型检查:

Prelude Control.Lens Data.Map> let elems = [(1,2),(3,4)] :: [(Double, Double)]
Prelude Control.Lens Data.Map> elems ^.. minimumOf _1

<interactive>:62:11:
    Couldn't match typeMaybe a0’
                  with ‘[(Double, Double)]
                        -> Const (Data.Monoid.Endo [a]) [(Double, Double)]’
    Expected type: Getting (Data.Monoid.Endo [a]) [(Double, Double)] a
      Actual type: (a -> Const (Data.Monoid.Endo [a]) a) -> Maybe a0
    Relevant bindings include it :: [a] (bound at <interactive>:62:1)
    Possible cause: ‘minimumOf’ is applied to too many arguments
    In the second argument of ‘(^..)’, namely ‘minimumOf _1’
    In the expression: elems ^.. minimumOf _1
1个回答

6
文档 对于使用方法已经相当清晰 -- 您如何改进它呢? minimumOf 不是一个镜头(或遍历或任何东西)-- 它需要一个折叠器(或遍历器或镜头或其他什么东西 -- 但是使用它与镜头没有用,因为您正在取得恰好一个事物的最小值),并查找它在结构上聚焦的最小值。例如:
λ> minimumOf (traverse . _1) [(1,'a'),(2,'b')]
Just 1

它将预操作函数minimum(它总是接受列表)概括为一个函数,该函数接受任何类型的值,并提供获取该值中一堆东西的说明,然后计算这些东西的最小值。

谢谢,看起来我在看旧版本的文档。 - yong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接