Haskell型变量
在这里完成noob to haskell,我正在尝试使以下代码工作: 它的目的是获取列表的第一个exp元素,将它们连接起来,然后再次调用相同的函数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 我真的不确
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