gpt4 book ai didi

f# - 展开 F# 单例区分联合元组类型

转载 作者:行者123 更新时间:2023-12-04 05:36:38 24 4
gpt4 key购买 nike

我们可以像 type Address = Address of string 这样解开类型使用解包函数,如

let unwrapAddress (Address a) = a
let addr = Address "sdf"
let str = unwrapAddress addr

所以 str类型为 string ,但如果有这样的类型,这种方法将不起作用:
type Composite = Composite of integer:int * someStr:string
let unwrap (Composite c) = c

会产生错误
let unwrap (Composite c) = c;;
------------^^^^^^^^^^^
error FS0019: This constructor is applied to 1 argument(s) but expects 2

我可以以某种方式将复合类型解包为一个简单的元组吗?

最佳答案

这些都对我有用。这是您的 matching语法,大多数情况下您会发现与 match 语句一起使用,但它位于 l.h.s.的任务。最初,这可能对元组最有意义,但您可以将其用于任何结构。

let (a,b) = (1,2)

let (x,_) = (4,5)

另外两件有趣的事情可以尝试:
let (head::tail) = [1;2;3;4]

FSI 响应警告 FS0025:此表达式上的模式匹配不完整。例如,值“[]”可以指示模式未涵盖的情况。

“这是真的,”你大声推理。 “我应该将它表达为匹配,并包含一个空列表作为一种可能性”。最好将这些类型的警告冒泡为完全真实的错误(参见: warn as error 例如 --warnaserror+:25)。不要忽视它们。通过习惯或编译器强制方法解决它们。单个案例的歧义为零,所以代码上。

更有用+有趣的是 l.h.s. 上的匹配语法。的函数赋值。这很酷。对于精巧的功能,你可以把里面的东西拆开,然后一步一步地对内部进行操作。
let f (Composite(x,y)) = sprintf "Composite(%i,%s)" x y

f (Composite(1,"one"))

> val it : string = "Composite(1,one)"

关于你的代码:
type Address = Address of string //using unwrapping function like

let unwrapAddress (Address a) = a
let addr = Address "sdf"
let str = unwrapAddress addr

type Composite = Composite of integer:int * someStr:string
let unwrap (Composite(c,_)) = c
let cval = Composite(1,"blah")
unwrap cval

解决方法:
let xy = Composite(1,"abc") |> function (Composite(x,y))->(x,y)

...但更好的方法是,假设您想保留单个案例 DU 的命名元素是...
let (|Composite|) = function | Composite(x,y)->(x,y)

let unwrap (Composite(x)) = x

let unwrap2 (Composite(x,y)) = (x,y)

... 不是通过单个案例 DU 进行严格分解,而是通过单个案例进行分解 Active Pattern

最后,您可以将方法附加到复合结构...
module Composite = 
let unwrap = function | Composite(x,y)->(x,y)

关于使用此技术的最佳讨论之一是在 here 上。

另外,请查看 unwrap 给我们的签名:一个接受 Composite(斜体)并返回一个 int(粗体)的函数

签名 -- val unwrap : Composite -> 国际

关于f# - 展开 F# 单例区分联合元组类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44574189/

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