"你在Haskell中通过声明什么而不是声明你如何得到它来进行计算"的含义是什么?

WKP*_*lus 6 haskell

最近我正在尝试学习一种函数式编程语言,我选择了Haskell.

现在我正在阅读学习一个haskell,这里的描述似乎是Haskell的哲学我不确定我是否完全理解它:你在Haskell中通过声明什么而不是声明你如何得到它来进行计算.

假设我想得到一个列表的总和.

声明你如何得到它的方式:通过添加所有元素来获得总和,所以代码将是这样的(不是haskell,python):

sum = 0
for i in l:
    sum += i
print sum
Run Code Online (Sandbox Code Playgroud)

什么样的东西是这样:总和是第一要素,其余元素的总和的总和,因此代码将是这样的:

sum' :: (Num a) => [a] -> a
sum' [] = 0
sum' (x:xs) = x + sum' xs
Run Code Online (Sandbox Code Playgroud)

但我不确定我是否得到它.有人可以帮忙吗?谢谢.

Aar*_*aim 9

命令式和功能性是解决问题的两种不同方式.

命令(Python)为您提供了用于获取所需内容的操作.例如,您可以告诉计算机"揉面团.然后将其放入烤箱.打开烤箱.烘烤10分钟.".

功能(Haskell,Clojure)为您提供解决方案.你更有可能告诉电脑"我有面粉,鸡蛋和水.我需要面包".电脑碰巧知道面团,但它不知道面包,所以你告诉它"面包是烤好的面团".计算机知道烘焙是什么,现在知道如何制作面包.你坐在桌旁10分钟,而电脑为你工作.然后,您可以在烤箱中享用新鲜的美味面包.

您可以看到工程师和数学家的工作方式有类似差异.工程师是必不可少的,看着问题并给工人一个蓝图来解决它.数学家定义问题(解决x)和解决方案(x = -----)并且可以使用任何数量的尝试和真正的解决方案来解决较小的问题(2x - 1 = ----- => 2x = - ---- + 1)直到他终于找到了理想的解决方案.

功能语言主要由大学里的人使用并不是巧合,不是因为它很难学,而是因为大学之外的数学思想家并不多.在你的引文中,他们试图通过巧妙地使用方法内容来定义思维过程中的这种差异.我个人认为每个人都会通过把它们变成他们已经理解的东西来理解单词,所以我想我的面包比喻应该为你澄清差异.

编辑:值得注意的是,当你强制命令电脑时,你不知道你最后是否会吃面包(也许你煮的时间太长而且烧了,或者你没有添加足够的面粉).这在函数式语言中不是问题,您可以准确地知道每个解决方案为您提供的内容.在函数式语言中不需要反复试验,因为你所做的一切都是正确的(虽然并不总是有用,比如意外地解决t而不是x).