推广算术运算符

时间:2013-08-05 22:14:18

标签: math haskell functional-programming numbers

两个数字的乘法可以通过算法定义,如下所示:'将第一个数字加到自身上的次数等于第二个数字的值'。两个数字的指数可以通过算法定义,如下所示:'将第一个数乘以它自己的次数等于第二个数的值'。考虑乘法和取幂的这些定义会引出一些问题......

首先,可以通过从add开始作为基本操作来定义一类算术运算吗?我写了一些haskell代码来测试这个想法:

order1 x y = x + y
order2 x y = foldl (order1) x (replicate (y - 1) x)
order3 x y = foldl (order2) x (replicate (y - 1) x)
order4 x y = foldl (order3) x (replicate (y - 1) x)
order5 x y = foldl (order4) x (replicate (y - 1) x)

果然,'order2'的意思是乘法,'order3'的意思是取幂。据我所知,英语中缺少'orderN'的单词,其中N> 3.数学界对这些操作有什么有趣的说法吗?

另外,考虑到那些'order'函数的递归外观,如何编写这样的函数:

generalArithmetic :: Int -> Int -> Int -> Int
generalArithmetic n x y =   --Comment: what to put here?

表示当n等于2时的乘法,表示当n等于3时的取幂...?

另外,如何概括这些算术函数以便它们可以对所有实数进行操作?毕竟,'复制'的类型是Int - > a - > [A]。

2 个答案:

答案 0 :(得分:4)

是。您可以从peano算术开始作为第一个订单(增量)

Brainf*ck只有递增,递减和检查非零值。即使这样,它可以做任何其他计算机程序可以做的任何计算,只要它总是有足够的内存并且你不急于得到答案。

此类属性称为Turing completenessBrainf*ck即使没有输入和输出也是如此。因此,使用<>+-[],您可以创建一个程序来解决所有可解决的数学问题其他编程语言。

到目前为止,我已经制作了加法,减法,平均,乘法,除法,模数和平方根的程序。

答案 1 :(得分:2)

如果有人关心我之前称之为'generalArithmetic'的定义,那么它就是:

arithmetic n x y = if n == 0
                   then (x + y)
                   else foldl (arithmetic (n - 1)) x (replicate (y - 1) x)