haskell - 如何使用 "Of"镜头? ( haskell )

标签 haskell lenses

我想写:

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 type ‘Maybe 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

最佳答案

documentation用法似乎相当清楚——您将如何改进它?
minimumOf不是镜头(或遍历或任何东西)-它需要折叠(或遍历或镜头或其他东西-但将它与镜头一起使用是没有用的,因为您只需要最少的一件事)并且寻找它在结构中关注的最小值。例如。

λ> minimumOf (traverse . _1) [(1,'a'),(2,'b')]
Just 1

它概括了 Prelude 函数 minimum -- 它总是采用一个列表 -- 到一个函数,该函数采用任何类型的值,以及从该值中取出一堆东西的指令,并计算这些东西中的最小值。

关于haskell - 如何使用 "Of"镜头? ( haskell ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27762519/

相关文章:

json - 使用 Aeson/JSON 自动派生自定义数据类型的实例

haskell - 用于交换函数参数的函数类型

haskell - 浏览前奏的源代码会产生怪异

haskell - 为什么类型类难以实现?

scala - 使用单片眼镜/scala 镜片时的权益成本

haskell - 通过镜头获得值(value) s t a b

Haskell 比较两个列表的长度,但其中一个是无限的?

haskell - 类型变量将逃脱其范围

haskell - 组合镜头

scala - 通过 `State` 映射 `Lens`