Haskell 理解列表理解有困难
我刚刚开始学习haskell(确切地说,今晚!),我在理解列表理解的逻辑方面有点困难,更具体地说,Haskell 理解列表理解有困难,haskell,list-comprehension,pythagorean,Haskell,List Comprehension,Pythagorean,我刚刚开始学习haskell(确切地说,今晚!),我在理解列表理解的逻辑方面有点困难,更具体地说,让三角形=[(a,b,c)| c[(a,b,c)| c读[作为“列表”,将作为“for”,将=作为“输入”或“推送通过”,尽管它的正式名称是“绑定”。它的定义(对于列表)为 f在这里被调用(通过map)按顺序调用xs的每个元素。它必须生成列表,以便它们可以与concat组合。因为空列表[]在concat上被消除(例如concat[[1],[3]=[1,3]=[1,3])所有未通过测试的元素将从最终输
让三角形=[(a,b,c)| c[(a,b,c)| c读[
作为“列表”,将
作为“for”,将=
作为“输入”或“推送通过”,尽管它的正式名称是“绑定”。它的定义(对于列表)为
f
在这里被调用(通过map
)按顺序调用xs
的每个元素。它必须生成列表,以便它们可以与concat
组合。因为空列表[]
在concat
上被消除(例如concat[[1],[3]=[1,3]=[1,3]
)所有未通过测试的元素将从最终输出中消除
有关完整的翻译,请参阅Haskell 98报告的。通常,列表理解可能包含模式,而不仅仅是变量名。理解
[e | pat <- ls, ...]
其中,pat
是一些模式,x
是一个新变量。当模式不匹配时,将生成一个空列表(而不是运行时错误),并跳过ls
的元素x
。这对于其他基于模式的过滤非常有用,例如[x | Just x我认为列表理解语法是Haskell在语言中的尝试。我们使用“[”而不是“{”和“详细且非常清晰,确实帮助我理解了材料。非常感谢!或者你可以启用并编写[(a,b,c)]c
ghci> let rightTriangles = [ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2]
for c from 1 to 10 step 1:
for b from 1 to c step 1:
for a from 1 to b step 1:
if (a^2 + b^2 == c^2):
emit (a,b,c)
[1..10] >>= (\c-> -- (a function of 'c', producing ...
[1..c] >>= (\b-> -- (a function of 'b', producing ...
[1..b] >>= (\a-> -- (a function of 'a', producing ...
if a^2+b^2==c^2 then [(a,b,c)] else []
-- or: [(a,b,c) | a^2+b^2==c^2]
)))
(xs >>= f) = concatMap f xs = concat (map f xs)
[e | pat <- ls, ...]
ls >>= (\x -> case x of pat -> [e | ...] ;
_ -> [] )