Haskell:更改列表中每个元素的数据类型

Haskell:更改列表中每个元素的数据类型,haskell,Haskell,昨天,我问了一个关于生成列表元组的问题: 现在,我一直在尝试更改列表[a]的输入元素,因为它们被放入输出元组中相应的列表中 我有一个手动数据类型: data itemRank = itemRank Int Item 我希望为每个项目分配等级。我希望对[a]的前4个元素中的每一个都分配1个等级,对[a]的下4个元素分配2个等级,对下一个元素分配3个等级,以此类推。 因此,如果: [a] =[“苹果”、“香蕉”、“橘子”、“猫”、“狗”、“马”、“葡萄”、“桃”] 那么我的输出将是: ( [ite

昨天,我问了一个关于生成列表元组的问题:

现在,我一直在尝试更改列表[a]的输入元素,因为它们被放入输出元组中相应的列表中

我有一个手动数据类型:

data itemRank = itemRank Int Item
我希望为每个项目分配等级。我希望对[a]的前4个元素中的每一个都分配1个等级,对[a]的下4个元素分配2个等级,对下一个元素分配3个等级,以此类推。 因此,如果:

[a] =[“苹果”、“香蕉”、“橘子”、“猫”、“狗”、“马”、“葡萄”、“桃”]

那么我的输出将是:

( [itemRank 1 "apple", itemRank 2 "dog"], ["itemRank 1 "banana", itemRank 2 "horse"], ["itemRank 1 "orange", itemRank 2 "grape"],  ["itemRank 1 "cat", itemRank 2 "peach"] ) 

使用我上一篇文章中的想法,首先输出列表的元组,然后更改元组中每个列表中的每个元素,会更容易吗?我一直试图一次完成这一切,但没有成功。谢谢你的帮助

首先,数据构造函数和类型构造函数应该以大写开头,因此您可以使用以下内容定义
ItemRank

type Item = String
data ItemRank = ItemRank Int Item deriving Show
我认为您确实最好先将项目预处理为4元组,然后对所有项目执行
zipWith
表达式。这样看来:

someFunc :: [Item] -> (ItemRank, ItemRank, ItemRank, ItemRank)
someFunc xs = let (a, b, c, d) = toFour xs in (f a, f b, f c, f d)
    where f = zipWith ItemRank [1..]
这就给了我们:

Prelude Control.Lens Control.Lens.Each> someFunc ["apple","banana","orange","cat","dog","horse","grape","peach"]
([ItemRank 1 "apple",ItemRank 2 "dog"],[ItemRank 1 "banana",ItemRank 2 "horse"],[ItemRank 1 "orange",ItemRank 2 "grape"],[ItemRank 1 "cat",ItemRank 2 "peach"])
import Control.Lens((&), (%~))
import Control.Lens.Each(each)

someFunc :: [Item] -> (ItemRank, ItemRank, ItemRank, ItemRank)
someFunc xs = toFour xs & each %~ zipWith ItemRank [1..]
Prelude Control.Lens Control.Lens.Each> someFunc ["apple","banana","orange","cat","dog","horse","grape","peach"]
([ItemRank 1 "apple",ItemRank 2 "dog"],[ItemRank 1 "banana",ItemRank 2 "horse"],[ItemRank 1 "orange",ItemRank 2 "grape"],[ItemRank 1 "cat",ItemRank 2 "peach"])