首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子区分联合上的匹配

子区分联合上的匹配
EN

Stack Overflow用户
提问于 2017-01-23 21:00:19
回答 3查看 108关注 0票数 3

如果我有一个带有多个值的有区别的联合共享一个子代(AppleMoreApples都有Apple类型)...

代码语言:javascript
复制
type Apples =
  | GrannySmith
  | Gala

type Fruit =
  | Apple of Apples
  | MoreApples of Apples
  | Banana

let speakFruit = function
  | Apple GrannySmith 
  | MoreApples GrannySmith -> "granny smith"
  | Apple Gala 
  | MoreApples Gala -> "gala"
  | Banana -> "banana"

有没有一种方法可以对子联盟进行匹配,以消除重复?-类似于:

代码语言:javascript
复制
let speakFruit2 = function
  | _ GrannySmith -> "granny smith"
  | _ Gala -> "gala"
  | Banana -> "banana"
EN

回答 3

Stack Overflow用户

发布于 2017-01-23 21:22:06

我不认为使用单一模式可以很好地做到这一点,但你可以定义一个活动模式,它将为你提供两种苹果合并的数据的另一种视角:

代码语言:javascript
复制
let (|AnyApple|Banana|) = function
  | Apple a | MoreApples a -> AnyApple a
  | Banana -> Banana 

这隐藏了标准的Banana定义-您可能应该使用另一个名称以避免混淆,但其余部分保持不变。现在,您可以使用AnyApple进行模式匹配

代码语言:javascript
复制
let speakFruit = function
  | AnyApple GrannySmith -> "granny smith"
  | AnyApple Gala -> "gala"
  | Banana -> "banana"
票数 5
EN

Stack Overflow用户

发布于 2017-01-23 21:20:03

这个怎么样?

代码语言:javascript
复制
let speakFruit = function
| Apple x | MoreApples x -> 
    match x with
    | GrannySmith -> "Granny Smith"
    | Gala -> "gala"
| Banana -> "banana"
票数 4
EN

Stack Overflow用户

发布于 2017-01-23 21:37:05

部分活动模式也可以是一种解决方案

代码语言:javascript
复制
let (|IsKind|_|) kind z =
    match z with
    | Apple x | MoreApples x -> if (kind = x) then Some true else None
    | _ -> None

let speakFruit x = 
    match x with
    | IsKind GrannySmith z -> "Granny Smith"
    | IsKind Gala z -> "Gala"
    | Banana -> "banana"
    | _ -> "something else"

但老实说,我同意Fyodor上面的观点。你可能应该重新考虑你的类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41807027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档