Haskell型变量

Haskell型变量,haskell,Haskell,在这里完成noob to haskell,我正在尝试使以下代码工作: 它的目的是获取列表的第一个exp元素,将它们连接起来,然后再次调用相同的函数 order ( i ) (l1)(l2) = do exp <- (2 ^ i) l <- (take exp l1) ++ (take exp l2 ) ++ (order (i+1) (drop exp l1) (drop exp l2)); return l 我真的不确

在这里完成noob to haskell,我正在尝试使以下代码工作:

它的目的是获取列表的第一个exp元素,将它们连接起来,然后再次调用相同的函数

order ( i ) (l1)(l2) =
        do exp <- (2 ^  i)
           l <- (take exp l1) ++ (take exp l2 ) ++ (order (i+1) (drop exp l1) (drop exp l2));
           return l
我真的不确定这到底意味着什么。不是2和i都是整数,然后应用求幂函数将得到一个整数吗


谢谢

我已将您的代码改写如下,并添加了一个main

order _ [] [] = []
order i l1 l2 =
                (take exp l1) ++ (take exp l2)
        ++      (order (i+1) (drop exp l1) (drop exp l2))
        where
        exp = 2^i

main = print $ order 1 [1,2,3,4] [3,4,5,6]
您犯的第一个错误是递归没有终止,因为
order
总是再次调用自己。第二个错误是使用了
do
,这引入了一个
monad
,考虑到您是Haskell的新手,我想澄清一下。目前仅用于I/O

我希望这有帮助


提示:您收到的错误消息是,
Int
列表是以数字方式使用的,没有默认的实现。这可能是由单子位于列表上方的
do
引起的,但我将把它留给Haskell中的裂缝来给出确切的解释。

do块中的所有语句都必须属于同一个单子。这包括
的右侧除了Bryan的观点之外,我想我可以帮助您解释出现特定错误的原因

最大的原因是
expma
,对于未知的
m
a

由于
^
运算符处理数值,因此它返回
Num a=>a
类型的内容。这让我们能够计算出,
2^i
应该是
(Monad m,Num(ma))=>ma
,对于未知的
m
a

exp
是从这个神秘的
ma
中提取出来的,因此它属于
a
类型。下一行包括类似于
take exp l1
的表达式
take
要求其第一个参数的类型为
Int
,因此
exp
必须是
Int
类型,因此我们可以判断出我们正在使用的未知
a
必须是
Int
。所以现在已知
2^i
类型(Monad m,Num(m Int))=>m Int
;它是某种一元整数

这行中还有
l
No instance for (Num [Int])
      arising from a use of `^'
    Possible fix: add an instance declaration for (Num [Int])
order _ [] [] = []
order i l1 l2 =
                (take exp l1) ++ (take exp l2)
        ++      (order (i+1) (drop exp l1) (drop exp l2))
        where
        exp = 2^i

main = print $ order 1 [1,2,3,4] [3,4,5,6]
do let exp = 2^i
   l   <- take exp l1 ++ ... 
   return l
order i l1 l2 = take exp l1 ++ ...
  where exp = 2^i