我正在学习 Haskell,我想做一个函数,它接收两个数字并在正数和负数之间插入。 感谢您的帮助。 示例:
intercalarNum 5 2 = [2,-2,2,-2,2]
尝试了很多方法,但 ghci 说每次都会出错,所以我不知道该怎么办了
intercalarNum :: (Num a , Ord a ) => a -> a -> [a]
intercalarNum 0 y = []
intercalarNum x y = y : intercalarnumAux (intercalarNum (x-1) y)
intercalarnumAux :: (Num a , Ord a ) => a -> a
intercalarnumAux x | x < 0 = -x
| x > 0 = -x
| x == 0 = 0
让我们从这部分开始:
intercalarnumAux :: (Num a , Ord a ) => a -> a
intercalarnumAux x | x < 0 = -x
| x > 0 = -x
| x == 0 = 0
现在,最后一个
0
也可以写成-0
,从x==0
开始,也可以写成-x
。如果我们选择这样做,我们就会得到
intercalarnumAux :: (Num a , Ord a ) => a -> a
intercalarnumAux x | x < 0 = -x
| x > 0 = -x
| x == 0 = -x
因此我们发现在所有情况下结果都是
-x
!我们可以简单地写
intercalarnumAux :: (Num a , Ord a ) => a -> a
intercalarnumAux x = -x
甚至
intercalarnumAux :: (Num a) => a -> a
intercalarnumAux x = -x
我们也可以根本不定义这个函数,而只需根据需要使用uniry minus(又名否定)
- ....
。
现在,让我们检查一下主例程:
intercalarNum :: (Num a , Ord a ) => a -> a -> [a]
intercalarNum 0 y = []
intercalarNum x y = y : intercalarnumAux (intercalarNum (x-1) y)
这实际上看起来相当不错。虽然当您尝试编译它时发现它仍然是错误的,但它大部分内容都是正确的。
第一个参数为
0
的基本情况是正确的。
归纳情况的输出列表以
y : ...
开头,这是正确的。
它还在递归调用中递减 x
,传递 x-1
,这是正确的。
现在,还有最后一件事需要解决。你很接近,所以让我给你一个提示。现在你调用
intercalarnumAux (intercalarNum (x-1) y)
,这意味着 - (intercalarNum (x-1) y)
但你不能像这样否定 list 。尝试对数字求负。好吧,不要否定 x-1
,因为递减它是正确的。你能找出其他需要求反的数字吗?请记住使用括号,如 (- somethingToNegateHere)
,否则减号可能会被解释为二进制减法。