【问题标题】:'Map' higher order Haskell function'Map' 高阶 Haskell 函数
【发布时间】:2011-12-13 15:25:12
【问题描述】:

我有一个清单,例如:

["Hello", "Goodbye"]

我想在列表中使用map

我之前成功使用过map

f = ("example" ++)

那么:

map f ["Hello", "Goodbye"]

将列出:

["exampleHello", "exampleGoodbye"]

但是如何使用f函数中的列表项呢?

例如,如果我想重复列表元素,那么

["Hello", "Goodbye"]

会变成

["HelloHello", "GoodbyeGoodbye"]

如何使用map 和函数f(和++)来做到这一点?

【问题讨论】:

  • 我不知道它是否对你有帮助,但f = ("example" ++) 只是f x = "example" ++ x 的简写。
  • @delnan 它实际上是f = (\x -> "example" ++ x) 而不是f x = "example" ++ x 的简写,不是吗?在优化方面,这些并不总是完全相同。
  • @leftaroundabout:从语义上讲,它们是相同的(单态限制会毁了这一天,但在这种情况下,由于字符串文字,类型无论如何都是单态的),这就是这里的全部。不知道优化有没有区别,OP也不在乎。

标签: string list haskell higher-order-functions map-function


【解决方案1】:

在做

map (\x -> x++x) ["Hello", "Goodbye"]

结果

["HelloHello","GoodbyeGoodbye"]

所以f 可以定义为f x = (x++x)

【讨论】:

  • 让我们看看...我们可以使用令人困惑的类型类函数吗?为什么是! liftM (join mappend) (mappend (return "Hello") (return "Goodbye")) :: [String]
【解决方案2】:

您可能希望对此类事情使用 lambda 函数。您想查看列表中的每个项目,然后将其替换为重复的自身。复制字符串很简单:\str -> str ++ str,现在您只需将该函数映射到列表上:

map (\x -> x ++ x) ["Hello", "Goodbye"]

【讨论】:

  • 感谢您的建议,工作正常,但不完全是我想要的:) - 将来会对列表做很多复杂的事情,但想知道如何首先涉及元素。不管怎么说,还是要谢谢你。 :)