Haskell-如何在成对列表中获取列表的元素?
我有一个结构Haskell-如何在成对列表中获取列表的元素?,haskell,Haskell,我有一个结构 type MyDatabase = [ (String, [String]) ] 给定第一个字符串,我希望遍历数据库并找到匹配的术语,然后返回它附带的列表 我有 lookup :: MyDatabase -> String -> [String] lookup dataBase str = [ list | (label, [list]) <- dataBase, str == label ] lookup::MyDatabase->String->[Stri
type MyDatabase = [ (String, [String]) ]
给定第一个字符串,我希望遍历数据库并找到匹配的术语,然后返回它附带的列表
我有
lookup :: MyDatabase -> String -> [String]
lookup dataBase str = [ list | (label, [list]) <- dataBase, str == label ]
lookup::MyDatabase->String->[String]
lookup dataBase str=[list |(label,[list])您几乎拥有了列表理解权限,如果您拥有数据库[(“foo”,[“bar”])]
并尝试查找[(“foo”,[“bar”])]“foo”
,这将返回一些信息。如果您的数据库是[(“foo”,[“bar”,“baz]),则不会工作
。这是因为在数据库中只有一个元素作为其关联字符串列表的元素上有模式匹配,因此如果一个键没有关联元素或有多个关联元素,则此项不起作用。您可以通过将其更改为(标签,列表)轻松解决此问题您几乎完全正确理解列表,如果您拥有数据库[(“foo”、[“bar”])
并且尝试查找[(“foo”、[“bar”])]“foo”
,则会返回一些信息。如果您的数据库是[(“foo”、[“bar”、“baz”]),则不会工作
。这是因为数据库中的元素只有一个元素作为其关联字符串列表,因此如果键没有关联元素或有多个关联元素,则无法进行模式匹配。您可以通过将其更改为(标签,列表)来轻松解决此问题。您需要对现有内容进行一些调整:
lookup :: MyDatabase -> String -> [String]
-- lookup ... = [ list | (label, [list]) <- dataBase, str == label ]
lookup dataBase str = [ s | (label, list ) <- dataBase, str == label
, s <- list ]
需要对您拥有的进行一些调整:
lookup :: MyDatabase -> String -> [String]
-- lookup ... = [ list | (label, [list]) <- dataBase, str == label ]
lookup dataBase str = [ s | (label, list ) <- dataBase, str == label
, s <- list ]
是否确实要重用名称str
,对函数参数进行阴影处理?它在技术上是正确的,但看起来很混乱。感谢您的帮助!工作非常完美。是否确实要重用名称str
对函数参数进行阴影处理?它在技术上是正确的,但看起来很混乱。感谢您的帮助!工作正常。函数已经存在。函数已经存在。谢谢你的帮助!谢谢你的帮助!
lookup :: MyDatabase -> String -> [String]
-- lookup ... = [ list | (label, [list]) <- dataBase, str == label ]
lookup dataBase str = [ s | (label, list ) <- dataBase, str == label
, s <- list ]
lookup dataBase str = concat . take 1 $
[ list | (label, list ) <- dataBase, str == label]