gpt4 book ai didi

haskell - 使用 Control.Lens 的索引列表需要 Monoid 约束

转载 作者:行者123 更新时间:2023-12-02 15:49:45 24 4
gpt4 key购买 nike

以下代码无法编译:

{-# LANGUAGE TemplateHaskell #-}

import Control.Lens

data MyType = MyType Int
data Outer = Outer { _inners :: [ Inner ] }
data Inner = Inner { _val :: MyType }

$(makeLenses ''Outer)
$(makeLenses ''Inner)

i1 = Inner (MyType 1)
i2 = Inner (MyType 2)

o = Outer [i1, i2]

x = o ^. inners . ix 0 . val

出现此错误

Toy.hs:17:23:
No instance for (Data.Monoid.Monoid MyType)
arising from a use of `ix'
Possible fix:
add an instance declaration for (Data.Monoid.Monoid MyType)
In the first argument of `(.)', namely `ix 0'
In the second argument of `(.)', namely `ix 0 . val'
In the second argument of `(^.)', namely `inners . ix 0 . val'

假设 MyType 成为幺半群没有意义,我怎样才能获得一个 Lens(或 Traversal,或任何最合适的 - 我不确定其中的区别)来允许我访问这个嵌套的 field ?最好具有读取和更新的能力。

最佳答案

因为 ix n 可能会失败(例如:n >= length list),因此您需要一种干净的方式来失败。选择的干净失败是来自 Monoidmempty 元素。因此,立即出现的问题是,如果您的类型不能是 Monoid,那么您希望这段代码如何失败?

我建议您使用 ^? 而不是 ^.,从而重用名为 MaybeMonoid:

*Main> o ^? inners . ix 2 . val
Nothing
*Main> o ^? inners . ix 0 . val
Just (MyType 1)

关于haskell - 使用 Control.Lens 的索引列表需要 Monoid 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17518301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com