2011-06-08 73 views
-1
func::[Int]->Bool 
func [] = False 
func (l:ls) = ff1 (l) 


ff1::Int->Bool 
ff1 j = j > 0 

当前此代码仅匹配第一个值。我尝试使用mapall,但没有得到好的结果。Haskell所有问题/地图功能

我的问题是,我需要检查,如果所有的值都匹配ff1的模式,如果所有的ls list元素,返回一个布尔值。

回答

4

我想你只需要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

+0

其实我在'ff1'中有一个复杂的模式检查,所以这不适合:) – Sudantha 2011-06-08 11:50:51

+0

@Sudantha:我编辑了我的答案以解决你的评论:) – MarcoS 2011-06-08 11:55:43

+0

'all f1 xs'是没有括号的答案:-) – Sudantha 2011-06-08 12:02:39

3

这应该工作:

func ls = all ff1 ls 

或者这样:

func ls = and (map ff1 ls) 
+0

没了:-(它不工作! – Sudantha 2011-06-08 11:49:20

+0

@Sudantha你能给输入它不工作的一个例子,而应改用生成的输出?Landei的答案应该为你的问题的工作,因为我明白那么,我们可能会误解你的问题,你可以用范例输入和范例输出来扩展它吗? – dave4420 2011-06-08 11:58:08

+0

是的,我在GHCI中试过了,并且它工作了,注意我编辑了这个问题,因为'ff1 j> 0 = True ''完全没有意义,'func'中缺少'='。 – Landei 2011-06-08 12:15:25

0

也许这样 - 假设你想在所有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