如何返回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)]

链接地址: http://www.djcxy.com/p/43323.html

上一篇: How to return a list of tuples in Haskell

下一篇: Write a generic function with exactly two variations of types of parameters