如何获取满足此条件的那些值的列表?

时间:2016-03-13 01:04:45

标签: haskell algebraic-data-types custom-data-type

假设我有类似这样的日期类型:

type GroupNb = Int
type Code = Int
type Name = String
type Random = Int

data Group = Group GroupNb Code Name Random deriving Show

我在其中“添加”一些数据(组)。

现在,我希望获得GroupNb 1作为Code"test"作为Name的所有groupNumbers :: [Group] -> [a] groupNumbers (Group _ a b _) = nub[List.find (a == 1 && b == "test") [GroupNb]] 列表。

def brujinGraph(k, strList):

    vertex = [[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0]]

    brujinGraph = {strList[i]: strList[j][:-1] for i in range(len(vertex)) for j in range(k) and vertex[i][j] == 1}

    return brujinGraph

strList = ['AAGA', 'AAGA', 'AGAT', 'ATTC', 'CTAA', 'CTCT', 'GATT', 'TAAG', 'TCTA', 'TCTC', 'TTCT']
brujinGraph(4, strList)

此解决方案不起作用......我怎么能这样做?

1 个答案:

答案 0 :(得分:3)

如果我已正确理解您的问题,您会根据谓词(Group)列出要code == 1 && name == "test"的列表。这正是filter函数的用途。这就是你的代码的样子:

someTest :: Group -> Bool
someTest (Group _ code name _) = code == 1 && name == "test"

allGroupPassingTest :: [Group] -> [Group]
allGroupPassingTest g = filter someTest g

辅助方法someTestfilter正在使用的谓词。

你的原始代码已经破了,because in haskell functions must start with a lower case。你的平等测试也被打破了,因为=用于分配,而不是测试平等(你正在寻找==)。我不知道方括号在这里做了什么nub[List.find (a = 1 && b = "test") [GroupNb]]。方括号(据我所知)的唯一用途是表示列表或列表类型。 [GroupNb]看起来您正在尝试将列表转换为此类型,但转换的方式是使用statement :: TypeCastList.find (a = 1 && b = "test")几乎是正确的,但(a = 1 && b = "test")应该写成像(\(Group _ code name _) -> code == 1 && name == "test")这样的lambda。

GroupNumbers :: Group -> [a]
GroupNumbers (Group _ a b _) = nub[List.find (a = 1 && b = "test") [GroupNb]]