从列表推导中返回一个布尔值

时间:2011-09-23 03:18:17

标签: haskell

我是haskell的新手,我正在处理一些函数式编程课程的教程问题。有一个问题我完全被困住了。

定义一个函数,该函数返回给定字符串是否包含所有数值(即“123”=> True,“1a3”=> False)。该函数必须使用列表推导。

这是杀死我的最后一部分。没有列表理解就可以轻松编写。使用谓词编写列表推导也很容易,以确保只将数字字符放入新列表中。

isNum  =  [ x | x <- xs, x `elem` ['0'..'9'] ]

但是我不知道如何将新列表与原始列表进行比较以检查是否相等,因为这是整个函数定义。

8 个答案:

答案 0 :(得分:3)

提示:使用列表推导,而不仅仅是列表推导。

是否有一些列表可以生成,然后运行一些进一步处理以获得所需的答案?

答案 1 :(得分:3)

如果我是你,我只会检查列表[x | x <- xs, not (elem x ['0'..'9'])]是否为空。

答案 2 :(得分:1)

我想到的首先出现在我脑海中的解决方案的小提示:

x elem ['0'..'9']对此有用,但不是作为后卫。

答案 3 :(得分:1)

我想家庭作业需要列表理解,但这样做的惯用方法是:

import Data.Char
isNum = all isDigit

作为一个笑话,如果你想在盒子外思考,你可以抛出列表理解,但忽略它!

isNum =
    let unnecessaryListComprehension = [x | x <- [0..]]
    in all isDigit

或使用Monoid

import Data.Monoid
isNum xs = getAll $ mconcat [All $ isDigit x | x <- xs]

答案 4 :(得分:0)

这是家庭作业吗?

由于列表理解仅包含数字字符,如果有任何非数字元素,结果列表将更短。

另一种方法是放isNum xs = [ elem x ['0'..'9'] | x <- xs ]。然后你有一个布尔值列表,告诉你每个字符是否是数字。您可以使用Prelude功能告诉您所有值是否为True

编辑:更有效率,还有一个Prelude函数可以告诉您是否有任何元素False,表示非数字元素。

答案 5 :(得分:0)

虽然有一个标记为正确的答案,但我认为完整的实施将是这样的:

isNum xs = foldr (&&) True [x `elem`['0'..'9'] | x <- xs] -- or

isNum xs = foldl (&&) True [x `elem`['0'..'9'] | x <- xs] -- or

isNum xs = and [x `elem`['0'..'9'] | x <- xs] -- Thanks for the comment of hammar

isNum "123" -- returns True
isNum "1a3" -- returns False

答案 6 :(得分:0)

isNum xs = null [x | x&lt; -xs,x notElem ['0'..'9']]

只检查列表是否为空..

答案 7 :(得分:0)

您可以使用此部分功能:

isNum :: [Char] -> Bool
isNum = foldl (\acc x -> acc && x `elem` ['0'..'9']) True

示例:

Prelude> isNum "111"
True
Prelude> isNum "111aaa"
False