如何设置两个参数的递归函数的初始条件(Haskell)

时间:2017-09-09 22:24:43

标签: haskell recursion

我正在通过了解你是一个很好的Haskell ,并试图解决有关递归章节的一些示例问题。

我试图编写一个带有下限的函数" a"和上限" b"并返回两者之间所有数字的总和。

我最初尝试(我认为是)一种直接的方法

sumInts :: Int -> Int -> Int
sumInts a a = a 
sumInts a b = (sumInts (a) (b-1)) + b

当我尝试编译时,我收到了错误声明

  

•'a'的定义冲突

我最终只想让这个东西起作用,所以我将应该是一个功能分成两个。

sumInts' :: Int -> Int
sumInts' 0 = 0
sumInts' a = sumInts' (a-1) + a


sumInts :: Int -> Int -> Int
sumInts 0 b = sumInts' b 
sumInts a b = (sumInts (a-1) (b)) - (a-1)

我试着搜索你认为是一个非常简单的问题。唉,结果似乎太小众了。

如何将我目前拥有的两个功能合并为一个功能?另外,为什么我的原始功能不起作用?关于如何在将来避免这种情况的任何提示?谢谢!

2 个答案:

答案 0 :(得分:3)

Haskell中的模式匹配是线性。这意味着在函数的头部(模式匹配部分)中不能写入两次变量。所以你的条款:

|

不允许。在这种情况下,您可以使用警卫

=

守卫是管道角色(otherwise)之后的条件。如果条件满足,则函数将评估等号右侧的部分(True)。 return只是$(document).ready(function() { // Store inner height in a data property: $(".added-msg-inner").removeClass("added-msg-inner").each(function() { $(this).data({ innerHeight: $(this).height() }); }).addClass('added-msg-inner'); $(".added-msg-inner > p:nth-child(2)").hide(); $(".downarrow").click(function() { // Get specific divView and innerHeight related to this down arrow var $divView = $(this).siblings(".added-msg-inner"); var innerHeight = $divView.data("innerHeight"); $divView.animate({ height: $divView.height() == 95 ? innerHeight : "95px" }, 500, function() { // Animation complete: if ($divView.height() > 95) { $(".added-msg-inner > p:nth-child(2)").show(); } else { $(".added-msg-inner > p:nth-child(2)").hide(); } }); $('i', this).attr("class", $divView.height() == 95 ? "fa fa-angle-up" : "fa fa-angle-down"); }); });的别名。

答案 1 :(得分:0)

我知道问题是关于递归,但是只使用一个函数的最简单方法是根本不使用递归,而是使用简单的数学公式。

sumInts :: Int -> Int -> Int
sumInts a b = ((a + b) / 2) * (b - a + 1)