繁体   English   中英

从Haskell列表中删除包含空值的元组

[英]Removing a tuple that contains a null from list in haskell

美好的一天!

所以我试图写一个函数是Haskell如下

remove_nulls :: [ ([String], Int) ] -> [ ([String], Int) ] -> [ ([String], Int) ]
remove_nulls listofpair (y:ys)
| null listofpair = (y:ys)
| null (fst(head listofpair))= remove_nulls (tail listofpair) (y:ys)
| otherwise = remove_nulls (tail listofpair) (y:(head listofpair):ys)

哪个输入看起来像这样

remove_nulls [ ([],0) , (["abc", "dce"], 2) ] []

想法是,如果元组的第一个值中包含null,则它将从列表中删除该元组。 但是,每次调用它时,它都会返回“ remove_nulls函数中的非穷尽模式”。

我尝试更改基本情况,但始终得到相同的结果。 任何帮助和利用都是很好的(目前只是学习Haskell)。

如果您只想删除所有具有空第一字段的对,

removeNulls xs = filter (not . null . fst) xs

会做到这一点。 如果您还不熟悉(not . null . fst)的表示法,则这只是编写函数\\pair -> not (null (fst pair))一种较短方法。 有关更多说明,请参见此SO问题

您的原始函数似乎尝试在第二个输入列表的第一个元素之后插入第一个列表中的好元素,但由于它没有涵盖第二个列表为空的情况而无法工作。

remove_nulls应该获取列表并因此返回一个新列表:

remove_nulls :: [ ([String], Int) ] -> [ ([String], Int) ]
remove_nulls lst = [(x,y) | (x,y) <- lst, (not.null) x]

因为您调用带有空列表作为第二个参数的remove_nulls,并且仅提供了第二个参数至少具有一个元素的定义(这是第一行的(y:ys)模式),所以找不到匹配项,导致您看到错误消息。

我认为(但没有尝试过)如果您摆脱y:比赛,它应该编译(但也许还没有做您想要的!)。 因此,尝试这样的事情:

remove_nulls :: [ ([String], Int) ] -> [ ([String], Int) ] -> [ ([String], Int) ]
remove_nulls listofpair ys
  | null listofpair = ys
  | null (fst (head listofpair))= remove_nulls (tail listofpair) ys
  | otherwise = remove_nulls (tail listofpair) (head listofpair:ys)

您错过添加一个额外的条件:当第二个列表为空时

remove_nulls :: [([a], t)] -> [([a], t)] -> [([a], t)]
remove_nulls [] ys = ys
remove_nulls (([], _):xs) ys = remove_nulls xs ys
remove_nulls (x:xs) [] = remove_nulls xs [x]       -- new condition
remove_nulls (x:xs) (y:ys) = remove_nulls xs (y:x:ys)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM