LCM在Haskell中的递归实现

LCM在Haskell中的递归实现,haskell,Haskell,我正在尝试用Haskell编写自己的多重LCM函数,该函数计算给定列表中所有元素的LCM。我试图使用属性lcm(a,b,c)=lcm(a,lcm(b,c))使其递归。这是我目前能想到的,但它给了我一些我无法理解的错误 multLCM xs | length(xs) == 2 = lcm head(xs) last(xs) | length(xs) > 2 = lcm head(xs) multLCM(drop 1 xs) 有人能帮我改进这个功能吗 非常感谢 您应该使用

我正在尝试用Haskell编写自己的多重LCM函数,该函数计算给定列表中所有元素的LCM。我试图使用属性lcm(a,b,c)=lcm(a,lcm(b,c))使其递归。这是我目前能想到的,但它给了我一些我无法理解的错误

 multLCM xs 
    | length(xs) == 2 = lcm head(xs) last(xs)
    | length(xs) > 2 = lcm head(xs) multLCM(drop 1 xs)
有人能帮我改进这个功能吗


非常感谢

您应该使用模式匹配来解构列表:

multiLCM (x:xs) = lcm x (multiLCM xs)
multiLCM [x]    = ???

您应该使用模式匹配来解构列表:

multiLCM (x:xs) = lcm x (multiLCM xs)
multiLCM [x]    = ???

括号不表示Haskell中的函数应用程序。例如,这些是等效的

lcm head(xs) last(xs)
lcm head xs  last xs
也就是说,函数
lcm
提供了参数
head
xs
last
xs

括号确实允许您通过将函数与其参数分组来指定函数应用程序


括号不表示Haskell中的函数应用程序。例如,这些是等效的

lcm head(xs) last(xs)
lcm head xs  last xs
也就是说,函数
lcm
提供了参数
head
xs
last
xs

括号确实允许您通过将函数与其参数分组来指定函数应用程序


你能告诉我什么时候可以用
$
代替括号吗?我总是发现confusing@KoundinyaVajjha你看到了吗?你能告诉我什么时候可以用
$
代替括号吗?我总是发现confusing@KoundinyaVajjha你看到了吗?我不知道如何完成你的答案。我不希望为单个元素列表定义我的
multiLCM
,而希望它只是两个元素列表的常规
lcm
。在这种情况下可以进行模式匹配吗?类似于
x:y:xs
的东西可能?为什么?我想不出什么好的理由不为单个元素列表定义multiLCM。我不知道如何完成你的答案。我不希望为单个元素列表定义我的
multiLCM
,而希望它只是两个元素列表的常规
lcm
。在这种情况下可以进行模式匹配吗?类似于
x:y:xs
的东西可能?为什么?我想不出有什么好的理由不为单个元素列表定义多个LCM。完全回避语法问题:因为<代码>(LCM,1)< /C>在自然数上形成一个幺半群,所以你应该考虑<代码> MultCCM= FoLDR LCM 1 < /代码>。这完全是美丽的(抱歉我对这3年的反应)完全回避了语法问题:因为<代码>(LCM,1)< /代码>在自然数上形成一个幺半群,你应该考虑<代码> MultCCM= FoLDR LCM 1 < /代码>这真是太美了(对不起,我迟了3年才对此做出反应)