列表理解赢得';在Haskell中不能给出正确的结果

列表理解赢得';在Haskell中不能给出正确的结果,haskell,list-comprehension,Haskell,List Comprehension,我正在这样做,并提出以下方法来测试给出的示例: module Main where import Data.List unsum x y z n = (y > 0) && (z > 0) && (((x*x) - (y*y)- (z*z)) == n) && ((x - y) == (y - z)) answer = snub $ takeWhile (<100) [n|x<-[1..],d<-[1..x`div`

我正在这样做,并提出以下方法来测试给出的示例:

module Main where
import Data.List

unsum x y z n = (y > 0) && (z > 0) && (((x*x)  - (y*y)- (z*z)) == n) && ((x - y) == (y - z))
answer = snub $ takeWhile (<100) [n|x<-[1..],d<-[1..x`div`2],n<-[x..100],y<-[x-d],z<-[y-d], unsum x y z n ]
    where 
      snub [] = []
      snub (x:xs) | elem x xs = snub (filter (/=x) xs)
                  | otherwise = x : snub xs
modulemain其中
导入数据。列表
unsm x y z n=(y>0)和(z>0)和((x*x)-(y*y)-(z*z))==n)和((x-y)==(y-z))
回答=冷落$takeWhile(第1点
我试图回答这个问题,发现这就是我提出的
n
s的顺序

[4,3,16,12,7,20,11,48,28,19,80,44,23,52,112,31,68,76,1156,43,176,559...

这可能意味着你的
takeWhile(我制作了自己的
nub
,因此它将返回一个列表,其中删除了两个重复项,因为问题需要唯一的
n
解决方案,因此这里解释了你的评论:)感谢您的帮助,我明白了为什么
takeWhile
不正确,因为
n
的解决方案在n超过100后跳回到0以下。好的,在尝试之后:
answer=length$snub$filter(>0)$map nsum[(x,x-d,x-d-d)| x
answer = snub $ filter (<=100) $ takeWhile (<200) [...listcomprehension...]
Main> take 30 [(x,y,z,n) | x<-[1..], d<-[1..x`div`2], n<-[x..100], y<-[x-d], z<-[y-d]]
[(2,1,0,2),(2,1,0,3),(2,1,0,4),(2,1,0,5),(2,1,0,6),(2,1,0,7),(2,1,0,8),(2,1,0,9),
(2,1,0,10),(2,1,0,11),(2,1,0,12),(2,1,0,13),(2,1,0,14),(2,1,0,15),(2,1,0,16),(2,1,0,17),
(2,1,0,18),(2,1,0,19),(2,1,0,20),(2,1,0,21),(2,1,0,22),(2,1,0,23),(2,1,0,24),(2,1,0,25),
(2,1,0,26),(2,1,0,27),(2,1,0,28),(2,1,0,29),(2,1,0,30),(2,1,0,31)]
ns = map nsum [(x, x-d, x-d-d) | x <- [1..], d <- [1..x`div`2]]
nsum (x,y,z) = x^2 - y^2 - z^2