List 如何在haskell中使用另一个可变向量筛选列表

List 如何在haskell中使用另一个可变向量筛选列表,list,haskell,vector,filter,List,Haskell,Vector,Filter,我是哈斯克尔的新手。我想在Haskell中实现以下python程序 a = [1,2,3,6,7,12,45,54,2,12,10] b = [1,2,3,6,7,8] c = [ i for i in b if a[i] % 2 == 0 ] print c 我希望a是Haskell中的Data.Vector.Mutable。 所以我写了一些类似的东西 let a1 = fromList ([1,2,3,6,7,12,45,54,2,12,10] :: [Int]) let b = [1,2

我是哈斯克尔的新手。我想在Haskell中实现以下python程序

a = [1,2,3,6,7,12,45,54,2,12,10]
b = [1,2,3,6,7,8]
c = [ i for i in b if a[i] % 2 == 0 ]
print c
我希望
a
是Haskell中的Data.Vector.Mutable。 所以我写了一些类似的东西

let a1 = fromList ([1,2,3,6,7,12,45,54,2,12,10] :: [Int])
let b = [1,2,3,6,7,8]
let c = [ i | i <- b, filter i a1 ] 
print c
let a1=fromList([1,2,3,6,7,12,45,54,2,12,10]:[Int])
设b=[1,2,3,6,7,8]

让c=[i | i假设
a::MVector s Int
b:[Int]
,结果应该是
c::m[Int]
,其中
m
是一些单子,因为我们使用的是可变向量。现在,我们只需要一个拟合谓词:

-- evenVM :: PrimMonad m => MVector (PrimState m) Int -> Int -> m Bool
evenVM v i = do
    if (M.length v) < i || i <= 0
      then return False
      else fmap even $ M.read v (i - 1)

如果
a
确实是一个可变向量,则不必使用
saw
。如果
a
是一个不可变向量,则可以使用
filter
和几乎与上面相同的方法。

让我们假设
a::MVector s Int
b:[Int]
并且您的结果应该是
c::m[Int]
,其中
m
是一些单子,因为我们使用的是可变向量。现在,我们只需要一个拟合谓词:

-- evenVM :: PrimMonad m => MVector (PrimState m) Int -> Int -> m Bool
evenVM v i = do
    if (M.length v) < i || i <= 0
      then return False
      else fmap even $ M.read v (i - 1)

如果
a
确实是一个可变向量,则不必使用
saw
。如果
a
是一个不可变向量,则可以使用
filter
和几乎与上面相同的方法。

让我们假设
a::MVector s Int
b:[Int]
并且您的结果应该是
c::m[Int]
,其中
m
是一些单子,因为我们使用的是可变向量。现在,我们只需要一个拟合谓词:

-- evenVM :: PrimMonad m => MVector (PrimState m) Int -> Int -> m Bool
evenVM v i = do
    if (M.length v) < i || i <= 0
      then return False
      else fmap even $ M.read v (i - 1)

如果
a
确实是一个可变向量,则不必使用
saw
。如果
a
是一个不可变向量,则可以使用
filter
和几乎与上面相同的方法。

让我们假设
a::MVector s Int
b:[Int]
并且您的结果应该是
c::m[Int]
,其中
m
是一些单子,因为我们使用的是可变向量。现在,我们只需要一个拟合谓词:

-- evenVM :: PrimMonad m => MVector (PrimState m) Int -> Int -> m Bool
evenVM v i = do
    if (M.length v) < i || i <= 0
      then return False
      else fmap even $ M.read v (i - 1)

如果
a
确实是一个可变向量,则不必使用
saw
。如果
a
是一个不可变向量,则可以使用
filter
和几乎与上述相同的方法。

您必须使用向量的
zip
对元素进行索引并相应地过滤

import Data.Vector
import Prelude hiding(zip, filter, elem, map, length)

main :: IO ()
main = do
    let a = fromList [1,2,3,6,7,12,45,54,2,12,10]
    let a' = fromList [0..(length a)]
    let b = fromList [1,2,3,6,7,8]
    let c = map snd $ filter (\(x,y) -> (y `elem` b) && x `mod` 2 == 0) (zip a a')
    print c
在ghci中:

ghci > main
fromList [1,3,7,8]

您必须使用Vector的
zip
对元素进行索引并相应地进行过滤

import Data.Vector
import Prelude hiding(zip, filter, elem, map, length)

main :: IO ()
main = do
    let a = fromList [1,2,3,6,7,12,45,54,2,12,10]
    let a' = fromList [0..(length a)]
    let b = fromList [1,2,3,6,7,8]
    let c = map snd $ filter (\(x,y) -> (y `elem` b) && x `mod` 2 == 0) (zip a a')
    print c
在ghci中:

ghci > main
fromList [1,3,7,8]

您必须使用Vector的
zip
对元素进行索引并相应地进行过滤

import Data.Vector
import Prelude hiding(zip, filter, elem, map, length)

main :: IO ()
main = do
    let a = fromList [1,2,3,6,7,12,45,54,2,12,10]
    let a' = fromList [0..(length a)]
    let b = fromList [1,2,3,6,7,8]
    let c = map snd $ filter (\(x,y) -> (y `elem` b) && x `mod` 2 == 0) (zip a a')
    print c
在ghci中:

ghci > main
fromList [1,3,7,8]

您必须使用Vector的
zip
对元素进行索引并相应地进行过滤

import Data.Vector
import Prelude hiding(zip, filter, elem, map, length)

main :: IO ()
main = do
    let a = fromList [1,2,3,6,7,12,45,54,2,12,10]
    let a' = fromList [0..(length a)]
    let b = fromList [1,2,3,6,7,8]
    let c = map snd $ filter (\(x,y) -> (y `elem` b) && x `mod` 2 == 0) (zip a a')
    print c
在ghci中:

ghci > main
fromList [1,3,7,8]

可以将“过滤器”与“贴图”结合使用

let a = [1,2,3,6,7,12,45,54,2,12,10]
    b = [1,2,3,6,7,8] :: [Int]
in filter even $ map (a !!)  b
如果需要此from Vector,可以添加两个from列表:

import qualified Data.Vector V 

let a = V.fromList [1,2,3,6,7,12,45,54,2,12,10]
    b = V.fromList ([1,2,3,6,7,8] :: [Int])
in V.filter even $ V.map (a V.!)  b
如果您更喜欢一元版本:

do
   a <- V.fromList [1,2,3,6,7,12,45,54,2,12,10]
   b <- V.fromList ([1,2,3,6,7,8] :: [Int])
   V.filter even (return (a V.! b))
do

a您可以将过滤器与地图结合使用

let a = [1,2,3,6,7,12,45,54,2,12,10]
    b = [1,2,3,6,7,8] :: [Int]
in filter even $ map (a !!)  b
如果需要此from Vector,可以添加两个from列表:

import qualified Data.Vector V 

let a = V.fromList [1,2,3,6,7,12,45,54,2,12,10]
    b = V.fromList ([1,2,3,6,7,8] :: [Int])
in V.filter even $ V.map (a V.!)  b
如果您更喜欢一元版本:

do
   a <- V.fromList [1,2,3,6,7,12,45,54,2,12,10]
   b <- V.fromList ([1,2,3,6,7,8] :: [Int])
   V.filter even (return (a V.! b))
do

a您可以将过滤器与地图结合使用

let a = [1,2,3,6,7,12,45,54,2,12,10]
    b = [1,2,3,6,7,8] :: [Int]
in filter even $ map (a !!)  b
如果需要此from Vector,可以添加两个from列表:

import qualified Data.Vector V 

let a = V.fromList [1,2,3,6,7,12,45,54,2,12,10]
    b = V.fromList ([1,2,3,6,7,8] :: [Int])
in V.filter even $ V.map (a V.!)  b
如果您更喜欢一元版本:

do
   a <- V.fromList [1,2,3,6,7,12,45,54,2,12,10]
   b <- V.fromList ([1,2,3,6,7,8] :: [Int])
   V.filter even (return (a V.! b))
do

a您可以将过滤器与地图结合使用

let a = [1,2,3,6,7,12,45,54,2,12,10]
    b = [1,2,3,6,7,8] :: [Int]
in filter even $ map (a !!)  b
如果需要此from Vector,可以添加两个from列表:

import qualified Data.Vector V 

let a = V.fromList [1,2,3,6,7,12,45,54,2,12,10]
    b = V.fromList ([1,2,3,6,7,8] :: [Int])
in V.filter even $ V.map (a V.!)  b
如果您更喜欢一元版本:

do
   a <- V.fromList [1,2,3,6,7,12,45,54,2,12,10]
   b <- V.fromList ([1,2,3,6,7,8] :: [Int])
   V.filter even (return (a V.! b))
do


a如果你是Haskell的新手,你不应该使用突变。告诉我们你想做什么,也许我们可以告诉你如何不使用突变。如果你是Haskell的新手,你不应该使用突变。告诉我们你想做什么,也许我们可以告诉你如何不使用突变。如果你是Haskell的新手,你不应该使用突变。告诉我们w你想做什么,也许我们可以告诉你如何在没有变异的情况下做。如果你是Haskell的新手,你不应该使用变异。告诉我们你想做什么,也许我们可以告诉你如何在没有变异的情况下做。OP想要它。用向量加法更新。这不会改变很多语句。这将过滤 a
,其索引也在
b
中。但是,原始代码希望
b
a
中偶数元素的所有索引之间的交点。Hi@mathk我需要a1是Data.Vector.Mutable。然后你不能使用!或!!。我在Data.Vector.Mutable.OP中没有看到筛选函数。我希望它是为它更新的Vector add这将过滤
a
中的所有偶数元素,其索引也在
b
中。但是,原始代码希望
b
a
中偶数元素的所有索引之间的交集。Hi@mathk我需要a1是Data.Vector.Mutable。然后您不能使用!或!!和I未在Data.Vector.Mutable.OP中看到筛选函数。已使用向量添加进行更新。这不会对语句进行太多更改。这将筛选
a
中的所有偶数元素,其索引也位于
b
中。但是,原始代码希望
b
a中偶数元素的所有索引之间的交点
.Hi@mathk我需要a1是Data.Vector.Mutable。然后你不能使用!或!!。而且我在Data.Vector.Mutable.OP中没有看到想要它的筛选函数。使用向量加法更新。这不会对语句有太大的改变。这将筛选
a
中的所有偶数元素,其索引也在
b
中。但是,原始的code希望
b
a
中偶数元素的所有索引之间的交点。Hi@mathk我需要a1是Data.Vector.Mutable。然后你不能使用!或!!。我在Data.Vector.Mutable中没有看到filter函数。
ifilter
在过滤时为你提供索引。a1必须是Data.Vector.Mutable
ifilter
过滤时为您提供索引。a1必须是数据。Vector.Mutable
ifilter
在过滤时为您提供索引。a1必须是数据。Vector.Mutable
ifilter
在过滤时为您提供索引。a1必须是