use*_*616 1 haskell functional-programming list-comprehension
我对Haskell很新,我正在尝试用代数组做一些事情.我的第一个功能就是采取一个操作和一个集合,找到可以通过在同一个集合的成员对上执行该操作而生成的集合的所有成员.这是我的代码:
group' f xs = [a | a <- xs, a <- combSet]
where combSet = [f x y | x <- xs, y <- xs]
Run Code Online (Sandbox Code Playgroud)
但是,此代码只返回combSet的成员集,忽略a <- xs谓词:
*Main> group' (*) [1, 2, 3, 4, 5]
[1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20,5,10,15,20,25,1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20,5,10,15,20,25,1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20,5,10,15,20,25,1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20,5,10,15,20,25,1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20,5,10,15,20,25]
Run Code Online (Sandbox Code Playgroud)
但是,当我将理解谓词的顺序切换为
group' f xs = [a | a <- combSet, a <- xs]
where combSet = [f x y | x <- xs, y <- xs]
Run Code Online (Sandbox Code Playgroud)
它返回正确的值,但列表比预期的要大:
*Main> group' (*) [1, 2, 3, 4, 5]
[1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么会发生这种情况,或者我是否做了一些愚蠢的事情?
你没有开头的谓词.你有两个列表,xs以及combSet你从你的元素.所以让我们用一个更简单的例子来检查行为:
example = [a | a <- [1,2,3], a <- [4,5,6]]
Run Code Online (Sandbox Code Playgroud)
这将导致concat $ replicate 3 [4,5,6],即[4,5,6,4,5,6,4,5,6].请注意,第一个列表中没有元素,后一个a 阴影绑定.
我们可以将上面的代码作为"列表中的所有元素[1,2,3]:命名当前元素a然后列出列表中的所有元素[4,5,6]:将列表中的当前元素命名为a(并忘记之前的变体)并返回那些as" .
因此上面的代码相当于
example = [a | _ <- [1,2,3], a <- [4,5,6]]
Run Code Online (Sandbox Code Playgroud)
或任何其他名称而不是_.
对于谓词,您需要一个Bool表达式,例如
evenNumbers = [a | a <- [1..100], even a]
Run Code Online (Sandbox Code Playgroud)
在您的情况下,布尔表达式很可能a `elem` combSet.