func::[Int]->Bool
func [] = False
func (l:ls) = ff1 (l)
ff1::Int->Bool
ff1 j = j > 0
当前此代码仅匹配第一个值。我尝试使用map
和all
,但没有得到好的结果。Haskell所有问题/地图功能
我的问题是,我需要检查,如果所有的值都匹配ff1
的模式,如果所有的ls list
元素真或假,返回一个布尔值。
func::[Int]->Bool
func [] = False
func (l:ls) = ff1 (l)
ff1::Int->Bool
ff1 j = j > 0
当前此代码仅匹配第一个值。我尝试使用map
和all
,但没有得到好的结果。Haskell所有问题/地图功能
我的问题是,我需要检查,如果所有的值都匹配ff1
的模式,如果所有的ls list
元素真或假,返回一个布尔值。
我想你只需要all
:
Prelude> :t all
all :: (a -> Bool) -> [a] -> Bool
Prelude> all (>0) [-10..10]
False
Prelude> all (>0) [1..10]
True
或者,如果你愿意,你可以这样做:
Prelude> let f1 x = x > 5 && x < 10
Prelude> let func xs = all f1 xs
Prelude> func [6..9]
True
Prelude> func [1..10]
False
它允许你创建一个功能f1
做一个复杂的检查。无论如何,你可以使用all
作为func
这应该工作:
func ls = all ff1 ls
或者这样:
func ls = and (map ff1 ls)
也许这样 - 假设你想在所有Bool结果之间执行“和”。
func::[Int]->Bool
func [] = True
func (l:ls) = ff1 (l) && func (ls)
ff1::Int->Bool
ff1 j = j > 0
main = do let a = func [-1, -2, 1, 2, 3]
print a
其实我在'ff1'中有一个复杂的模式检查,所以这不适合:) – Sudantha 2011-06-08 11:50:51
@Sudantha:我编辑了我的答案以解决你的评论:) – MarcoS 2011-06-08 11:55:43
'all f1 xs'是没有括号的答案:-) – Sudantha 2011-06-08 12:02:39