Haskell中的双for循环

Kev*_*vin 1 recursion haskell loops

我正在尝试使用元组的第二个数字创建一个新列表,如果第一个数字在第一个列表中,这里是一个示例 helplist [0,2] [(0,"a"),(3,"x"),(5,"y"),(1,"b"),(2,"c")] = ["a","c"]

我尝试了很多组合,但是没有成功,这是我的代码:

helplist :: [Int] -> [(Int,Char)] -> [Char]
helplist (x:xs) ((i,g):gs) | (x == i) = g : helplist xs gs
helplist _ _ = []

Run Code Online (Sandbox Code Playgroud)

在Java中,我做了2次for循环,但是在haskell中,我只知道递归。

che*_*ner 7

Haskell已经具有在关联列表中查找单个值的功能:

lookup :: Eq a => a -> [(a, b)] -> Maybe b
Run Code Online (Sandbox Code Playgroud)

您需要做的就是在键上映射(适当地应用于列表)。

> helpList keys table = map (\x -> lookup x table) keys
> helpList [0,2] [(0,"a"),(3,"x"),(5,"y"),(1,"b"),(2,"c")]
[Just "a",Just "c"]
Run Code Online (Sandbox Code Playgroud)

好吧,差不多。这会给您返回Maybe String值列表。如果确定每次查找都会成功(或者根本不在乎失败的查找),则可以使用catMaybesfrom函数Data.Maybe删除Nothing响应并从其Just包装中提取实际值。

> import Data.Maybe
> helpList keys table = catMaybes $ map (\x -> lookup x table) keys
> helpList [0,2] [(0,"a"),(3,"x"),(5,"y"),(1,"b"),(2,"c")]
["a","c"]
Run Code Online (Sandbox Code Playgroud)