gpt4 book ai didi

f# - F# 中的捕获计数

转载 作者:行者123 更新时间:2023-12-02 07:25:45 25 4
gpt4 key购买 nike

我是一名长期的 C# 开发人员,并试图掌握 F# 并为此我想做一个小项目,我需要以下内容:是否可以创建具有以下行为的函数以及如何创建?注意:我知道使用 ref 可能是可行的,但我希望它更“纯粹”地发挥作用。

let count (x:int) (y:iny): (int -> int * int) = 
??

let myCount = count 1

// --------

let myCount, value = myCount 2;; // value is now 3
let myCount, value = myCount 3;; // value is now 6
let myCount, value = myCount 1;; // value is now 7

最佳答案

您提供的类型签名是不可能的(因为您在那里返回了一个包含两个整数的元组,但显然第一个应该再次具有与count 1 相同的签名> 本身是不可能的——你必须以某种方式包装它)。

但是根据你的例子,我认为你想要的应该是可能的:

这是一个与您的略有不同的版本,但我想您明白了:

type Counter = { value : int; update : int -> Counter }
let rec counter init =
{ value = init; update = fun upd -> counter (upd+init) }

这是实际操作:

> let myCounter = counter 1;;

val myCounter : Counter = {value = 1;
update = <fun:counter@118>;}

> let myCounter = myCounter.update 2;;

val myCounter : Counter = {value = 3;
update = <fun:counter@118>;}

> let myCounter = myCounter.update 3;;

val myCounter : Counter = {value = 6;
update = <fun:counter@118>;}

> let myCounter = myCounter.update 1;;

val myCounter : Counter = {value = 7;
update = <fun:counter@118>;}

对你来说足够近了吗?


当然,如果你放弃纯粹性,你可以让这种方式更简单(在 F# 中做这样的事情确实很常见):

let counter init =
let value = ref init
fun upd ->
value := !value + upd
!value

这是你的例子

> let myCounter = counter 1;;
val myCounter : (int -> int)

> myCounter 2;;
val it : int = 3
> myCounter 3;;
val it : int = 6
> myCounter 1;;
val it : int = 7

关于f# - F# 中的捕获计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32063585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com