首页 > 解决方案 > 在列表中查找元素并返回字符串 - haskell

问题描述

嗨,我想显示第二天步行 0 分钟的狗的名字

type Dogs = (String, Float, Float, [Int]) -- Dog,Age,Weight,Time walked daily


testData :: [Dogs]
testData = [("Morris", 5, 8, [0,0,5,8,8,0,0]), 
        ("Tinks", 3, 10, [12,8,15,0,0,0,2]), 
        ("Cash", 6, 11, [0,6,5,0,0,0,3]), 
        ("Lou", 5, 17, [0,2,10,7,8,2,2]),
        ("Kobi", 10, 12, [0,0,8,3,6,7,5]) 
        ("Nala", 7, 8, [8,16,20,3,4,9,2])] 

所以输出将是莫里斯和科比,因为他们在列表中有 0 秒,但我不知道该怎么做,我对 haskell 很陌生。我知道我应该使用!! 1从列表中获取第二个元素,但我不知道如何为列表中的元组中的多个列表执行此操作,然后输出为名称的字符串。任何帮助将不胜感激谢谢

标签: haskell

解决方案


首先,您可以创建一个单独的函数来确定您正在寻找的条件是否得到满足:

isDay2Walked :: Dogs -> Bool
isDay2Walked (_, _, _, (_:x:_)) = x /= 0 -- pattern matching would be more elegant than (!! 1)
isDay2Walked _ = False -- return something if there is no information about the second day

然后,在列表的过滤器中使用此谓词,并提取第一个元素 - 名称:

getDogName :: Dogs -> String
getDogName (name, _, _, _) = name

getDogsNotWalkedOnDay2 :: [Dogs] -> [String]
getDogsNotWalkedOnDay2 = map getDogName . filter (not . isDay2Walked)

推荐阅读