何时向 F# 中的现有函数添加单位参数

the*_*ist 4 f# idioms function memoization unit-type

如果我已经将其他参数传递给函数,假设该函数是非确定性的,我是否有理由也传递单位参数?我需要担心记忆重复返回值吗?在这种情况下,需要考虑风格或习语的任何方面吗?

Tom*_*cek 5

如果您已经有一个接受一些参数的函数,但也恰好有一些副作用并且是不确定的,那么我不希望该函数接受额外的unit参数。例如,一个randomPoint函数只接受maxXandmaxY但不接受额外的unit

let rnd = System.Random()

// Normal way of writing this
let randomPoint maxX maxY = 
  rnd.Next(maxX), rnd.Next(maxY)

let pt1 = randomPoint 100 200

// You can do this, but it is not usual style
let randomPoint maxX maxY () = 
  rnd.Next(maxX), rnd.Next(maxY)

let pt2 = randomPoint 100 200 ()
Run Code Online (Sandbox Code Playgroud)

在某些情况下,额外的unit参数可能会有所帮助,但这只是当您想要创建稍后调用的函数时的情况。例如:

let makePointGenerator maxX maxY = 
  let rnd = System.Random()
  fun () -> rnd.Next(maxX), rnd.Next(maxY)

// This should be used as follows
let gen = makePointGenerator 100 200
let pt1 = gen () 
let pt2 = gen ()

// You can call it like this, but it is not the intention
let pt3 = makePointGenerator 100 200 ()
Run Code Online (Sandbox Code Playgroud)

像这样的东西有时可能对记忆有用 - 但这不是自动发生的事情,所以如果您发现自己编写需要此功能的代码,您就会知道。