我正在通过了解你是一个很好的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)
我试着搜索你认为是一个非常简单的问题。唉,结果似乎太小众了。
如何将我目前拥有的两个功能合并为一个功能?另外,为什么我的原始功能不起作用?关于如何在将来避免这种情况的任何提示?谢谢!
答案 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)