Haskell并行广义(类SQL)列表理解问题
也许我误读了docs(),但在下面的代码中,我希望列表理解zs和zs'具有相同的值。但是,它们是不同的,如主打印两条不同的线所示:Haskell并行广义(类SQL)列表理解问题,haskell,syntax,list-comprehension,Haskell,Syntax,List Comprehension,也许我误读了docs(),但在下面的代码中,我希望列表理解zs和zs'具有相同的值。但是,它们是不同的,如主打印两条不同的线所示: {-# LANGUAGE ParallelListComp, TransformListComp #-} import GHC.Exts xs = [10,20..90] ys = map (`mod`7) xs zs = [(x,y) | x<-xs | y<-ys, then sortWith by y] zs' = [(x,y) | (x,y)
{-# LANGUAGE ParallelListComp, TransformListComp #-}
import GHC.Exts
xs = [10,20..90]
ys = map (`mod`7) xs
zs = [(x,y) | x<-xs | y<-ys, then sortWith by y]
zs' = [(x,y) | (x,y) <- zip xs ys, then sortWith by y]
main = print zs >> print zs'
谢谢。看来索利泽的评论是正确的。第一个结果是,条形图的关联比逗号更松散。这记录在dons的“平行列表理解”部分下的链接中。不知道该怎么办 下面的代码非常难看(重复了(x,y)的绑定),但顺便说一句,修复了solrize的语法错误
zs <- [(x,y) | (x,y) <- [(x,y) | x<-xs | y<-ys], then sortWith by y]
Dons,谢谢,现在我不确定我做了什么才得到了正确的输出。是的,我的注释中的代码是一个语法错误(我无法修复它或在那里注释,因为我已经没有浏览器cookie了,唉)。我看不出有什么办法可以解决这个问题,除了“zip”,这有点令人失望,但好吧。(哦,看起来我可以将编辑放入队列,这与mathoverflow不同)。对我来说像个bug。这至少是因为没有清楚地传达句法翻译是什么。solrize的链接状态: 给出对表格的平行理解: 这就意味着
-- this produces the same result as your zs'
[ (x,y) | (x,y) <- zip [x' | x' <- xs]
[y' | y' <- ys]
, then sortWith by y ]
--这将产生与zs相同的结果
[(x,y)|(x,y)嗯,zs=[(x,y)| xDoesn您评论中的版本没有语法错误吗?至少,它失败了,或者是我。对于那些不熟悉此扩展的人,这里描述了:为什么直觉会将sortWith
放在最后的省略号中?语法示例清楚地表明,,
比@sclv对我来说更紧密地绑定到语法x看起来只是x形式的表达式。括号中的|
表达式也正是我在调查我的答案时理想化的表达式。当然,将它们分组的简单方法就是使用zip
和朋友,如zs'
zs = [(x,y) | (x<-xs | y<-ys), then sortWith by y]
[ e | p1 <- e11, p2 <- e12, ...
| q1 <- e21, q2 <- e22, ...
...
]
[ e | ((p1,p2), (q1,q2), ...) <- zipN [(p1,p2) | p1 <- e11, p2 <- e12, ...]
[(q1,q2) | q1 <- e21, q2 <- e22, ...]
...
[ (x,y) | x <- xs
| y <- ys
, then sortWith by y ]
-- this produces the same result as your zs'
[ (x,y) | (x,y) <- zip [x' | x' <- xs]
[y' | y' <- ys]
, then sortWith by y ]
[ (x,y) | x <- xs
| y <- ys, then sortWith by y
]
-- this produces the same result as your zs
[ (x,y) | (x,y) <- zip [x' | x' <- xs]
[y' | y' <- ys, then sortWith by y']
]