如何使用"Of"镜头? (哈斯克尔)
How to use the "Of" lenses? (Haskell)
我要写:
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
——它总是接受一个列表——泛化为一个接受任何类型值的函数,以及从该值中获取一堆东西的指令,并计算这些东西中的最小值。
我要写:
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
——它总是接受一个列表——泛化为一个接受任何类型值的函数,以及从该值中获取一堆东西的指令,并计算这些东西中的最小值。