gpt4 book ai didi

haskell - 如何使用镜头列表?

转载 作者:行者123 更新时间:2023-12-02 14:08:58 24 4
gpt4 key购买 nike

我可以使用遍历列表吗?代码如下:

f::[Int] -> [[Int]]
f l = [l & i .~ 1 | i<-[ix 0], (l^? i) == Just 0]

产生错误:

  • Couldn't match type ‘Const (Data.Monoid.First Int) [Int]’
with ‘Identity [Int]’
Expected type: ASetter [Int] [Int] Int Integer
Actual type: Getting (Data.Monoid.First Int) [Int] Int
• In the first argument of ‘(.~)’, namely ‘i’
In the second argument of ‘(&)’, namely ‘i .~ 1’
In the expression: l & i .~ 1

查看this question我想我需要以某种方式明确地给 i 一个类型,但我的每次尝试都失败了。

最佳答案

问题不在于显式指定类型。每次你想要一个镜头或遍历的容器(镜头在对内,镜头在列表内,镜头在也许内),你需要使用 ReifiedLens .

请参阅此问题以获取解释:

Why do we need Control.Lens.Reified?

所以你的例子应该这样写:

import Control.Lens

f :: [Int] -> [[Int]]
f l = [ l & i .~ 1
| Traversal i <- [Traversal $ ix 0]
, l ^? i == Just 0
]

Note that here Traversal is a constructor of type ReifiedTraversal.

它的工作原理是这样的:

ghci> f [0,0,0]
[[1,0,0]]

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

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