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