Haskell 不能';t与预期类型“[a1]”和#x27匹配;实际类型为“([a1],[a1])';

Haskell 不能';t与预期类型“[a1]”和#x27匹配;实际类型为“([a1],[a1])';,haskell,Haskell,我对Haskell的代码还不熟悉,我的教授想让我们写的代码让我深陷其中。我应该将一个列表处理为一对列表,如下所示: deal [1,2,3,4,5,6,7] = ([1,3,5,7], [2,4,6]) 但是我在我的'xs'和'ys'上得到了这个错误 * Couldn't match expected type `[a1]' with actual type `([a1], [a1])' * In the expression: deal xs

我对Haskell的代码还不熟悉,我的教授想让我们写的代码让我深陷其中。我应该将一个列表处理为一对列表,如下所示:

deal [1,2,3,4,5,6,7] = ([1,3,5,7], [2,4,6])
但是我在我的'xs'和'ys'上得到了这个错误

* Couldn't match expected type `[a1]'
                  with actual type `([a1], [a1])'
    * In the expression: deal xs
      In an equation for `xs': xs = deal xs
      In an equation for `deal':
          deal (x : y : xs : ys)
            = (x : xs, y : ys)
            where
                xs = deal xs
                ys = deal ys
    * Relevant bindings include xs :: [a1] (bound at lab2.hs:16:17)
   |
   |                 xs = deal xs
   |                      ^^^^^^^
这是我的密码:

交易::[a]->([a],[a]) 交易[]=([],[]) 交易[x]=([x],])) 交易(x:y:xs:ys)=(x:xs,y:ys) 哪里 xs=交易xs ys=交易ys
这是合乎逻辑的,因为这里您的
deal xs
deal ys
将返回,给定签名一个两元组列表,
xs
具有类型
[a]
。请注意,通过使用相同的名称,您在这里创建了一个递归表达式,这将不起作用。多次使用同一名称不是一个好主意。如果启用“警告”,编译器通常会对此发出警告

您可能需要在列表的
rest
上调用
deal
,然后检索用作尾部的两个列表:

deal :: [a] -> ([a],[a])
deal [] = ([], [])
deal [x] = ([x], [])
deal (x:y:rest) = (x:xs, y:ys)
    where (xs, ys) = deal rest
另一种方法是每次交换元组并附加到另一侧:

import Control.Arrow(first)
import Data.Tuple(swap)

deal :: [a] -> ([a],[a])
deal [] = ([], [])
deal (x:xs) = first (x:) (swap (deal xs))
因此,我们可以将其定义为
foldr
模式:

import Control.Arrow(first)
import Data.Tuple(swap)

deal :: Foldable f => f a -> ([a],[a])
deal [] = foldr ((. swap) . first . (:)) ([], [])
这给了我们预期的结果:

Prelude> deal [1,2,3,4,5,6,7]
([1,3,5,7],[2,4,6])

这是合乎逻辑的,因为这里您的
deal xs
deal ys
将返回,给定签名一个两元组列表,并且
xs
具有类型
[a]
。请注意,通过使用相同的名称,您在这里创建了一个递归表达式,这将不起作用。多次使用同一名称不是一个好主意。如果启用“警告”,编译器通常会对此发出警告

您可能需要在列表的
rest
上调用
deal
,然后检索用作尾部的两个列表:

deal :: [a] -> ([a],[a])
deal [] = ([], [])
deal [x] = ([x], [])
deal (x:y:rest) = (x:xs, y:ys)
    where (xs, ys) = deal rest
另一种方法是每次交换元组并附加到另一侧:

import Control.Arrow(first)
import Data.Tuple(swap)

deal :: [a] -> ([a],[a])
deal [] = ([], [])
deal (x:xs) = first (x:) (swap (deal xs))
因此,我们可以将其定义为
foldr
模式:

import Control.Arrow(first)
import Data.Tuple(swap)

deal :: Foldable f => f a -> ([a],[a])
deal [] = foldr ((. swap) . first . (:)) ([], [])
这给了我们预期的结果:

Prelude> deal [1,2,3,4,5,6,7]
([1,3,5,7],[2,4,6])

啊,好吧,我明白了。谢谢你的启发。啊,好吧,我明白了。谢谢你启发我。