【问题标题】:Calling helper function to reverse lists, then zipping lists in Haskell调用辅助函数来反转列表,然后在 Haskell 中压缩列表
【发布时间】:2020-06-01 01:32:31
【问题描述】:

我是 Haskell 的新手,我已经尝试了几个小时让这两个函数一起工作,以使用递归和没有内置函数来生成一个压缩的反向列表。

这是反转列表的辅助函数:

reverseList :: [x] -> [x]
reverseList  [] = []
reverseList  xs = last xs : reverseList (init xs)

然后是拉链功能

ZipRevLists2 :: [x] -> [y] -> [(x, y)]
ZipRevLists2 _ [] = []
ZipRevLists2 [] _ = []
ZipRevLists2 (x:xs) = reverseList xs
ZipRevLists2 (y:ys) = reverseList ys
ZipRevLists2 (x:xs) (y:ys) = (x,y) : ZipRev2Lists xs ys

我正在尝试向 learnyouahaskell.com 学习,但唯一的例子是“ghci>”而不是真正的函数形式。

【问题讨论】:

  • 您可以先压缩然后反转,也可以分别反转(两者)然后压缩。值不能以大写开头,并且所有大小写必须具有相同数量的参数。递归调用lastinit,您将获得二次性能。
  • 我正在尝试做后者,我分别反转然后 zip.. 当你说大写时,你的意思是我会使用“zipRevLists2”而不是“ZipRevLists2”?
  • 是的,我的意思是 - 大写用于类型。尝试单独写出zip,然后将helpers zipreverse组合成你想要的整体函数。
  • @moonGoose 这些是正确的建议,但用词错误。 变量不能以小写开头。函数是变量,所以这里适用。但是值可以是大写的(值构造函数),类型可以是小写的(类型变量)。重要的区别在于变量和构造函数之间,而不是值和类型之间。

标签: list haskell zip helper


【解决方案1】:

谢谢,我终于明白了!

Zip 功能

zip' :: [x] -> [y] -> [(x,y)]
zip' _ [] = []
zip' [] _ = []
zip' (x:xs) (y:ys) = (x,y):zip' xs ys

主要功能

zipRevLists2 :: [Int] -> [Char] -> [(Int,Char)]
zipRevLists2 _ [] = []
zipRevLists2 [] _ = []
zipRevLists2 (x:xs) (y:ys) = zip' (reverseList (x:xs))  (reverseList (y:ys))

【讨论】:

  • 由于zip'(可能还有reverseList)已经在为你做模式匹配,你也可以稍微简化一下:zipRevLists2 :: ...; zipRevLists2 xs ys = zip' (reverseList xs) (reverseList ys)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多