【发布时间】:2011-05-22 10:46:20
【问题描述】:
我正在编写一些 F# 代码,并且正在编写一个函数来从一组字符串中返回一个随机字符串。假设我有这样的事情:
open System
let a = [|"a";"b";"c";"d"|]
let rstring (arr:string[]) =
let r = new Random()
arr.[r.Next(0,3)]
let resultstring = rstring a;;
我的问题是:我对函数式编程概念的理解是,如果给定函数每次都具有相同的输入,则它应该始终返回相同的输出。那么在这种特殊情况下,每次“副作用”都会返回不同的字符串?我只是好奇。
如果这是一个重复的问题,只需将我指向原始问题,我将关闭它。我不确定我会使用什么搜索字符串来查找与此相关的任何问题。
编辑:感谢大家提供的所有信息。似乎我将引用透明性和没有副作用的概念混为一谈了。所以,感谢大家让我明白其中的不同之处,并感谢您的回答。
【问题讨论】:
-
总是为相同的参数返回相同的结果实际上意味着纯粹,而不是无副作用(副作用的定义已经发布)。
-
当您开始挑剔时,“副作用”在软件中并不是一个有趣的概念。引用透明度和/或纯度是有趣/有用的概念,随机/非确定函数不是引用透明的,这才是最重要的。因此,从某种意义上说,OP 提出了错误的问题,或者至少不是一个有趣/有用的问题。标题提出的问题挑剔了定义。对软件来说重要的是,如果你的函数为相同的输入返回不同的值,那么它会给你带来一整类错误。
-
@delnan - 根据定义,纯函数要求函数没有副作用。仅仅因为一个函数总是返回相同的结果并不意味着它是纯粹的。