Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 理解列表理解有困难_Haskell_List Comprehension_Pythagorean - Fatal编程技术网

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])所有未通过测试的元素将从最终输

我刚刚开始学习haskell(确切地说,今晚!),我在理解列表理解的逻辑方面有点困难,更具体地说,
让三角形=[(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 | ...] ;
                        _   -> [] )