Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#序列和记录_F#_Functional Programming - Fatal编程技术网

F#序列和记录

F#序列和记录,f#,functional-programming,F#,Functional Programming,我有两个序列 type Suit = Spades | Clubs | Hearts | Diamonds type Rank = Ace | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King type Card = { suit: Suit; rank: Rank} 和intValueCard={rank:rank;value:int}//将联合转换为实际的int 我只是想知

我有两个序列

type Suit = Spades | Clubs | Hearts | Diamonds
type Rank = Ace | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King

type Card = { suit: Suit; rank: Rank}
intValueCard={rank:rank;value:int}//将联合转换为实际的int

我只是想知道我怎样才能得到这张卡片在实际整数中的排名。。。到目前为止我有

let getActualValue (card:Card) =
    value |> translatedValue.Rank

但就我的一生而言,我不知道如何处理序列,
getActualValue
不起作用。

你可以将
Rank
声明为枚举:

type Rank = 
    | Ace = 1 
    | Two = 2 
    | Three = 3 
....
然后使用
int
获取基础值:

let getActualValue ({rank = r}) = int r

我没有看到任何序列。你有被歧视的工会的诉讼和等级,你有一张记录卡。不确定您所说的
intValueCard={rank:rank;value:int}
是什么意思,getActualValue引用了一个未解释的translatedValue。秩中的整数值将用于什么?如果你编辑并改进你的问题,你可能会得到更好的帮助

假设你想要排名来计算游戏中的优势。最好创建这样的函数

let weightFromRank rank =
    match rank with
    | Ace -> 1
    | Two -> 2
    ...etc...
您可以使用
函数
关键字来简化此函数的版本

我认为使用enum不是一个好主意,因为您将错过函数式编程的重要优势。枚举是.NET类型,而不是函数类型

不同类型的游戏在王牌上有不同的权重。有些比赛给王牌14分,比国王高一分。然后,根据所玩的游戏类型,您可以使用不同的函数来计算权重


请接受以下建议,因为我不是F#方面的顶尖专家。另一种不同的方法是将权重作为一个单独的字段放在一个记录或一个歧视性的联合或类似的东西中。我认为这种方法效率较低,因为权重来自排名,因此在不需要信息的地方会有效地复制信息,从而使代码更难理解。对于不同类型的游戏,处理不同权重的效率也会较低。

如果您想将整数排名与其他排名进行比较,那么您可以只比较区分的联合值,因为比较是免费内置的:

Eight < Nine // true
Jack < Six // false

[Seven; Ace; Four; Two] |> List.sort
// [Ace; Two; Four; Seven]
8<9//true
杰克〈六//
[Seven;Ace;Four;Two]|>List.sort
//[A;二;四;七]
现在,如果出于某种原因,确实需要整数秩值,那么可以使用反射来获取DU案例。只需确保在顶级模块值中执行,而不是在函数中执行,以便在程序启动时仅执行一次反射:

open FSharp.Reflection
let ranks =
    FSharpType.GetUnionCases(typeof<Rank>)
    |> Array.map (fun c -> FSharpValue.MakeUnion(c, [||]) :?> Rank)

let getActualValue rank = Array.findIndex ((=) rank) ranks

getActualValue Ace // 0
getActualValue Two // 1
getActualValue King // 12
打开FSharp.Reflection
让队伍=
FSharpType.GetUnionCases(typeof)
|>Array.map(乐趣c->FSharpValue.MakeUnion(c,[| |]]):?>Rank)
让getActualValue rank=Array.findIndex((=)rank)列
getActualValue Ace//0
getActualValue 2//1
getActualValue King//12
您应该看看