【问题标题】:Multiple parameters of a function一个函数的多个参数
【发布时间】:2015-05-30 19:03:31
【问题描述】:

如何给予

break (== ' ') xxs

多个布尔参数而不改变定义?或者这是不可避免的。比如

break (== (' ' || '\t' || '\n')) xss

foldlfoldr 是一种方式,但在这里它们不适用,或者至少我无法使用它们。

【问题讨论】:

  • break (flip elem " \t\n")?
  • 你可以给break 任何函数作为它的第一个参数。因此,您可以创建一个新函数作为您想要的谓词并将其传递给break
  • @Zeta 是的,它有效,但你能解释一下吗?
  • elem检查列表中是否有某些内容,因此这将检查参数是'\t' 还是'\n'(字符串是字符列表) - 现在elem 想要它的参数顺序错误 Zeta 必须先flip 函数
  • 参见:Data.Char.isSpace, Prelude.words

标签: function haskell parameters arguments fold


【解决方案1】:

这是你要找的吗?

break (\x -> x == ' ' || x == '\t' || x == '\n') xss

【讨论】:

  • 这个答案很棒,因为它正好在OP的层面,并且无需过度解释就打开了一个新世界。
【解决方案2】:

您当前的问题实际上并不是关于多个参数,而是break 的不同谓词。让我们考虑一下break 的类型:

break :: (a -> Bool) -> [a] -> ([a], [a])

这种类型的函数(a -> Bool) 称为谓词。您可以使用任何使用正确的a 并返回Bool。这就是你的第一个代码类型检查的原因:

ghci> :t (== ' ')
(== ' ') :: Char -> Bool

现在,如果您想使用多个字符作为可能的中断符号,您需要使用另一个Char -> Bool。如果字符是固定的(而且你没有很多),你可以使用列表[Char]elem

yourCharacters = [' ','\t','\n'] 

predicate :: Char -> Bool
predicate c = c `elem` yourCharacters

我们可以用它作为break的谓词:

myBreak = break (`elem` yourCharacters)

此时,您还可以更改 myBreak 以获取字符列表,此时您将获得:

myBreak' :: [Char] -> [Char] -> ([Char], [Char])
myBreak' limiters = break (`elem` limiters)
-- myBreak' limiters str = break (`elem` limiters) str

HTH

【讨论】:

    猜你喜欢
    • 2012-06-25
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多