如何返回Haskell中的元组列表
我正在C ++中进行优化,并一直试图在Haskell中重新编码实验,以进行踢球和笑声。 这样做很粗糙,但很有趣。
我想写一个函数,返回一个3个整数元组的列表,如下所示:
[(1,1,1),(1,2,1),(1,3,2)]
以下是我一直试图使用的代码:
sortToTuples :: (Num a) => [a] -> Int -> Int -> [(Int,Int,a)]
sortToTuples [] _ _ = []
-- i and j are passed as 1 and 1.
sortToTuples (x:xs) i j
| j > 9 = [(i+1, 1, x)] ++ sortToTuples (xs i+1 1)
| otherwise = [(i, j+1, x)] ++ sortToTuples (xs i, j+1)
该函数的意思是采用一个表示数独游戏的平面列表,并返回一个元组列表(i,j,x),其中i是行值,j是列值,x是单元格的值。
无论出于何种原因,haskell对我的签名非常不满意:
Prelude> :l quicksort.hs
[1 of 1] Compiling Main ( quicksort.hs, interpreted )
quicksort.hs:23:44:
Couldn't match expected type `[(Int, Int, a)]'
with actual type `Int -> Int -> [(Int, Int, a0)]'
In the return type of a call of `sortToTuples'
Probable cause: `sortToTuples' is applied to too few arguments
In the second argument of `(++)', namely
`sortToTuples (xs i + 1 1)'
In the expression: [(i + 1, 1, x)] ++ sortToTuples (xs i + 1 1)
Failed, modules loaded: none.
Prelude>
这里有一些语法错误
| j > 9 = [(i+1, 1, x)] ++ sortToTuples (xs i+1 1)
| otherwise = [(i, j+1, x)] ++ sortToTuples (xs i, j+1)
你几乎是正确的,应该是
... sortToTuples xs (i+1) 1
... sortToTuples xs i (j+1)
这样每个参数分别传递给sortToTuples
。
为了解释编译器错误,它将(xs i+1 1)
看作单个参数,并且由于它解析的是正确的Haskell,它认为sortToTuples
的第一个参数应该具有类型[a]
,所以它认为sortToTuples (xs i+1 1)
应该有类型Int -> Int -> [(Int, Int, a)]
。
上一篇: How to return a list of tuples in Haskell
下一篇: Write a generic function with exactly two variations of types of parameters