Haskell 差异副产品

Haskell 差异副产品,haskell,syntax,Haskell,Syntax,我需要用签名diffFolge::(Integer,Integer)->[Integer]创建一个函数,当它应用于参数对(m,n)(m,n>0)时,返回一个数字降序列表,即两个数字之间的差值n。第一个元素是 结果列表为m,但最后一个元素始终大于0,最后一个元素 0或严格小于0的值 我写的如下: diffFolge :: (Integer,Integer) -> [Integer] diffFolge (m,n) = if m > 0 && n > 0 then

我需要用签名
diffFolge::(Integer,Integer)->[Integer]
创建一个函数,当它应用于参数对
(m,n)
m,n>0
)时,返回一个数字降序列表,即两个数字之间的差值
n
。第一个元素是 结果列表为
m
,但最后一个元素始终大于
0
,最后一个元素
0
或严格小于
0
的值

我写的如下:

diffFolge :: (Integer,Integer) -> [Integer]
diffFolge (m,n) = if m > 0 && n > 0 then [m,m-n..n-2*n] else [] 
范例

input  : diffFolge (5,1)
output : [5,4,3,2,1,0]
input  : diffFolge (5,2)
output :[5,3,1,-1]   ---> This is true by my code
范例

input  : diffFolge (5,1)
output : [5,4,3,2,1,0]
input  : diffFolge (5,2)
output :[5,3,1,-1]   ---> This is true by my code

但是,对于第一个示例中给出的输入,我的函数返回
[5,4,3,2,1,0,-1]
。如何更正此问题?

Haskell的
[a..b]
语法返回一个包含
b
的列表(如果可能)

您可以使用
[m,m-n..1-n]
,以便排除
-n


(顺便说一句,
n-2*n==-n

Haskell的
[a..b]
语法返回一个包含
b
的列表(如果可能)

您可以使用
[m,m-n..1-n]
,以便排除
-n


(顺便说一句,
n-2*n==-n

我不知道你想要什么,但我猜就是这样:

diffFolge  (m,n) | m <= 0    = [m]
                 | otherwise = m : diffFolge (m-n,n)

diffFolge(m,n)| m我不知道你想要什么,但我猜就是这样:

diffFolge  (m,n) | m <= 0    = [m]
                 | otherwise = m : diffFolge (m-n,n)

diffFolge(m,n)|m对我来说,您还断言m>=n
所以这里有一个简单的想法:

diffFolge :: (Integer, Integer) -> [Integer]
diffFolge (m,n)
    | m <= 0 || n <= 0 = []
    | n > m = diffFolge (n,m)    -- | Only if you want this case
    | otherwise = takeWhile (>= 0) $ iterate (\x->x-n) m
diffFolge::(整数,整数)->[整数]
diffFolge(m,n)
|m=0)$iterate(\x->x-n)m

对我来说,您还声明了m>=n 所以这里有一个简单的想法:

diffFolge :: (Integer, Integer) -> [Integer]
diffFolge (m,n)
    | m <= 0 || n <= 0 = []
    | n > m = diffFolge (n,m)    -- | Only if you want this case
    | otherwise = takeWhile (>= 0) $ iterate (\x->x-n) m
diffFolge::(整数,整数)->[整数]
diffFolge(m,n)
|m=0)$iterate(\x->x-n)m

有时候,做一点数学是值得的。:)

此外,在Haskell中,对函数的多个参数使用元组也是不常见的。我更有可能写作

df m n = [m, m-n .. 1-n]
然后,如果出于某种原因我真的需要一个取元组的函数,我会写:

diffFolge = uncurry df

有时候,只做一点点数学是值得的

此外,在Haskell中,对函数的多个参数使用元组也是不常见的。我更有可能写作

df m n = [m, m-n .. 1-n]
然后,如果出于某种原因我真的需要一个取元组的函数,我会写:

diffFolge = uncurry df

这是真的,但举例来说,当我给这个例子diffFolge(5,2)output muss so[5,3,1,-1]这是真的,但举例来说,当我给这个例子diffFolge(5,2)output muss so[5,3,1,-1]啊,我错过了KennyTM已经指出这一点的答案。啊,我错过了KennyTM已经指出这一点的答案。