从函数返回随机值副作用?

Ono*_*cci 6 f# functional-programming

我正在研究一些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;;
Run Code Online (Sandbox Code Playgroud)

我的问题是:我对函数式编程概念的理解是,如果给定的函数每次都有相同的输入,它应该总是返回相同的输出.那么在这种特殊情况下每次返回一个不同的字符串"副作用"?我只是好奇.

如果这是一个重复的问题,请指出我原来的,我会关闭它.我不确定用什么搜索字符串来查找与此相关的任何问题.


编辑:感谢大家的所有信息.我似乎把参考透明度和缺乏副作用的概念混为一谈.所以,感谢所有人让我直截了当地感谢你的答案.

Bri*_*ian 13

是.

函数可以从同一输入返回不同值的唯一方法是通过副作用.其他人可能会另有说法,但他们错了.

(你可以声称'阅读系统时间'(显然是基于效果)不是一种效果.根据这个定义,它不是副作用.但这个定义没有用,因为人们"关心"的唯一原因关于副作用是因为它们会影响参照透明度.换句话说,参考透明度是唯一重要的,这个功能显然不是参考透明的.)

  • 大气状态现在是计划国家的一部分.在一个完全静止的空气室里,也许没有状态的变化,但现在房间里的空气是由计算机程序建模的计算的一部分. (10认同)

Nik*_*chi 7

"副作用"表示某些状态由函数更改,而不是返回值不同.在您的情况下,该函数正在执行这两项操作 - 它正在更改PRNG的状态并返回不同的值.

编辑:

我还要补充一点,如果函数总是返回给定输入的相同值,则称为幂等."副作用"还包括从外部状态读取的功能.例如:

int global = 0;
int function()
{
  return global;
}
Run Code Online (Sandbox Code Playgroud)

有副作用.