1
A
回答
1
假设我们有一个列表:
myList :: [[Int]]
myList = [[1,2],[3,4,5]]
让我们将sum . map sum
:
(sum . map sum) [[1,2],[3,4,5]]
= sum [sum [1,2], sum [3,4,5]]
= sum [1+2,3+4+5]
= 1+2+3+4+5
现在,让我们应用sum . concat
:
(sum . concat) [[1,2],[3,4,5]]
= sum [1,2,3,4,5]
= 1+2+3+4+5
希望你可以看到现在,因为(a + b)+ c = a +(b + c),我们添加事物的顺序无关紧要,因此将内部列表相加,然后对整个列表进行求和得到与简单求和内部列表的每个值相同的结果。
5
非正式地说,这只是说
,因为
如果加法是关联的,那么不管你如何分组你所添加的数字。 (a + b) + (c + d)
与(a + b + c + d)
相同。
形式上,我们可以使用等式推理和结构归纳法来证明任何大小的列表。 (请参阅这两个过程的快速定义的端部。)
假设map
以下定义,concat
,sum
,和(.)
:
map sum [] = []
map sum (a:as) = sum a : map sum as
concat [] = []
concat (a:as) = a ++ concat as
sum [] = 0
sum (a:as) = a + sum as
(f . g) x = f (g x)
为了让下面简单一点的证明,我们将要求没有明确的证据(见下文),其
sum (a ++ b) == sum a + sum b
(sum . map sum) as == (sum . concat) as
均分推理意味着我们可以使用一个平等像
a = b
与b
或b
与a
我们证明的任何步骤更换a
。列表上的结构归纳是一个引导过程。假设某些属性对于大小为
k
的列表属性为true,则使用该属性证明对于大小为k+1
的列表是正确的。那么,如果你能证明k=0
的确如此,这意味着所有的k
都是如此。例如,如果它是k=0
真,那么这是事实为k=1
,这意味着它为真k=2
等
首先我们确定空列表的身份是真的。
(sum . map sum) [] == sum (map sum []) -- (7)
== sum [] -- (1)
== sum (concat []) -- (3)
== (sum . concat) [] -- (7)
(请注意,我们不需要定义5,因为一个空列表是空列表。)
现在,添加一个新的定义,大小k
的任何列表as
。
如果(9)为真,我们可以证明为大小k+1
的列表中的身份:
(sum . map sum) (a:as) == sum (map sum (a:as)) -- (7)
== sum (sum a : map sum as) -- (2)
== sum a + sum (map sum as) -- (6)
== sum a + (sum . map sum) as -- (7)
== sum a + (sum . concat) as -- (9)
== sum a + sum (concat as) -- (7)
== sum (a ++ concat as) -- (8)
== sum (concat (a:as)) -- (4)
== (sum . concat) (a:as) -- (7)
通过诱导,我们有证明了任何大小的列表sum . map sum == sum . concat
。
定义4假定的++
一个定义:
[] ++ bs = bs
(a:as) ++ bs = a : (as ++ bs)
与++
定义,我们可以证明(8):
基本情况:a是空的
sum ([] ++ b) == sum b -- definition of ++
== 0 + sum b -- definition of +
== sum [] + sum b -- definition of sum
假设sum (a++b)
为长度k
的a
真,
sum ((a:as) ++ bs) == sum (a : (as ++ bs)) -- definition of ++
== a + sum (as ++ bs) -- definition of sum
== a + sum as + sum bs -- induction
== sum (a:as) + sum bs -- definition of sum
相关问题
- 1. 为什么这两个表达式在语义上不相等?
- 2. 这两个表达式是否相等
- 3. 为什么这个表达式与算法成本相关有这个结果?
- 4. 这个正则表达式为什么匹配这么多?
- 5. 为什么这个正则表达式不符合这个?
- 6. 为什么这个正则表达式不排除这个词?
- 7. 为什么这个算术表达式产生这个结果?
- 8. 这个表达式是什么意思,它为什么编译?
- 9. 这个Perl正则表达式的PHP等效什么
- 10. 这个三元表达式的等价if语句是什么?
- 11. 为什么这个xpath表达式返回一个空列表?
- 12. 这个表达式有什么作用?
- 13. 这个正则表达式做什么?
- 14. 这个正则表达式做什么?
- 15. 为什么这个正则表达式像这样?
- 16. 为什么这两个列表不相等?
- 17. 这个Perl正则表达式的PHP相当于什么?
- 18. 什么是MySQL的SQL正则表达式这个表达式
- 19. 为什么茱莉亚用这种复杂的方式表达这个表达?
- 20. 这些数字为什么不相等?
- 21. 为什么这些值不相等?
- 22. 为什么这种类型不相等?
- 23. 为什么这个URL匹配的正则表达式在等号处中断?
- 24. 为什么这个正则表达式模式(tr1 :: regex)异常?
- 25. 为什么这个表达式评估为false?
- 26. 为什么这个JavaScript表达式评估为false?
- 27. 为什么这个表达式继续评估为0
- 28. 为什么这两个表达式评估为不同的值?
- 29. 为什么这个表达式在JavaScript中被评估为“a”?
- 30. 为什么我应该在这里使用这个“while”表达式?那个表达意味着什么?
注:关联的'法(A + B)+ C = A +(B + C)'是不正确的用于'双'或'Float',例如见((0.7 + 0.2)+ 0.1'和'0.7 +(0.2 +0.1)'。 – epsilonhalbe
因此,您可以获得'sum $ map sum [[0.7],[0.2,0.1]]'和反例https:// sum $ concat [[0.7],[0.2,0.1]]' – epsilonhalbe
source不同。 .COM /问题/ 10371857 – epsilonhalbe