插入函数

问题描述 投票:0回答:1

我正在学习 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 
haskell functional-programming
1个回答
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)
,否则减号可能会被解释为二进制减法。

© www.soinside.com 2019 - 2024. All rights reserved.