Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 元组模式匹配列表Haskell_List_Haskell_Pattern Matching - Fatal编程技术网

List 元组模式匹配列表Haskell

List 元组模式匹配列表Haskell,list,haskell,pattern-matching,List,Haskell,Pattern Matching,我试图实现一个函数,其中我有一个2元组列表,它返回对应于True的元组。第一个字符是字符串,第二个字符是布尔值。这就是我想要的: pack [ ("a", True), ("b", False), ("c", False), ("d", True) ] returns [ ("a", True), ("d", True) ] 这是我的密码: pack :: [String] -> [Bool] -> [(String, Bool)] pack [] [] = []

我试图实现一个函数,其中我有一个2元组列表,它返回对应于True的元组。第一个字符是字符串,第二个字符是布尔值。这就是我想要的:

pack  [ ("a", True), ("b", False), ("c", False), ("d", True) ]
       returns [ ("a", True), ("d", True)  ]
这是我的密码:

pack :: [String] -> [Bool] -> [(String, Bool)]
pack [] [] = []
pack (x:xs) [] = []
pack [] (y:ys) = []
pack (x:xs) (True:ys) = (x, True) : pack xs ys
pack (x:xs) (False:ys) = pack xs ys
我只能通过输入来获得{returns[((a),True),((d,True)]}

pack ["a", "b", "c", "d"] [True, False, False, True]

这不是我想要的,我很困惑如何处理这个问题。任何帮助、指导或链接都将不胜感激。

我将使用您试图实施的内容的描述,向您展示我的解决方案步骤。希望这能帮助您在将来找到自己的解决方案

如果我重新措辞,您需要一个具有以下签名的函数:

pack::[(字符串,Bool)]->[(字符串,Bool)]

也就是说,您有一个2元组的列表(第一个元素是
字符串,第二个元素是
Bool
),并且您希望得到一个相同类型的列表

您希望筛选此列表中的所有元组,并仅保留具有
True
值的元组。前奏曲恰好有这样一个功能:

filter::(a->Bool)->[a]->[a]

filter
的第一个参数是一个称为谓词的函数
a->Bool
,用于定义要保留在第二个参数中的内容(第一个
[a]

请注意,
a
可以是任何类型,因此我们可以将
a
替换为
(String,Bool)
,而
过滤器将具有以下类型:

filter::((字符串,Bool)->Bool)->[(字符串,Bool)]->[(字符串,Bool)]

它开始越来越接近我们的
pack
目标签名!我们缺少的是谓词
(String,Bool)->Bool
,它将告诉
过滤器
我们要保留的内容:

isTrue :: (String, Bool) -> Bool
isTrue (_, True)  = True
isTrue (_, False) = False
最后,我们可以根据
filter
isTrue
实现
pack

pack :: [(String, Bool)] -> [(String, Bool)]
pack = filter onlyTrue
您在评论中提到,您不想使用任何“内置”功能。让我们摆脱
filter
然后,写
pack
更接近您发布的原始样式:

pack [] = []
pack (x:xs)
    | isTrue x  = x : pack xs
    | otherwise = pack xs

使用
pack=filter snd
@4castle我很想使用它,但我尝试在不使用任何内置Haskell函数的情况下使用它