OCaml:如何正确处理总和类型?

多拉蒙

假设我有以下代码:

type s = A of a | B of b


let foo (a:?) = 

let bar (input:s) = match input with
| A a -> foo input
| B b -> ...

我的问题是我应该在foo的签名中填写问号,这样我就不需要(冗余)match语句了吗?还是有更好的模式来做到这一点?

Didierc

如果您想避免重新比赛,我会看到3个解决方案:

  1. 使函数foo简单地采用值构造函数的“有效负载” A,并重建类型的值s作为其输出(或与的输出类型匹配的任何其他类型bar)。

    # type a;;
    type a
    # type b;;
    type b
    
    
    # module Ex1 = struct
    
      type s = A of a | B of b
    
    
      let foo (a:a) = A a
    
      let bar (input:s) = match input with
      | A a -> foo a
      | B b -> (* ... *) input
    end;;
    
    module Ex1 :
    sig
      type s = A of a | B of b 
      val foo : a -> s 
      val bar : s -> s 
    end
    
  2. 使用多态变体:

    # module Ex2 = struct
    
      type s = [ `A of a | `B of b ]
    
      let foo (`A a) = `A a
    
      let bar (input:s) = match input with
        | `A _ as a -> foo a
        | `B b -> (* ... *) input
     end;;
     module Ex2 :
     sig
       type s = [ `A of a | `B of b ]
       val foo : [< `A of 'a ] -> [> `A of 'a ]
       val bar : s -> s
     end
    
  3. 使用GADT:

    # module Ex3 = struct
    
      type _ s = 
      | A : a -> a s 
      | B : b -> b s
    
    
      let foo (a: a s) : a s = 
        match a with
        | A a -> A a
    
      let bar: type x.  x s -> x s = fun input ->
        match input with
        | A _ as a -> foo a
        | B b -> (* ... *) input
    
     end;;
     module Ex3 :
     sig
       type _ s = A : a -> a s | B : b -> b s
       val foo : a s -> a s
       val bar : 'x s -> 'x s
     end
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何正确处理httpClient?

来自分类Dev

如何正确处理scanf()

来自分类Dev

如何正确处理并发?

来自分类Dev

如何正确处理导航

来自分类Dev

Flask下的fork如何正确处理?

来自分类Dev

如何正确处理Visual Studio关闭?

来自分类Dev

如何正确处理请求承诺错误?

来自分类Dev

如何正确处理AsyncTasks的RejectedExecutionException?

来自分类Dev

AngularJS-如何正确处理承诺

来自分类Dev

如何正确处理异步并发请求?

来自分类Dev

如何正确处理SSLSocketImpl死锁?

来自分类Dev

如何正确处理标头中的异常?

来自分类Dev

如何正确处理回调堆栈

来自分类Dev

如何正确处理ThreadLocal变量?

来自分类Dev

如何正确处理异步操作?

来自分类Dev

如何正确处理python错误

来自分类Dev

如何正确处理左边距?

来自分类Dev

我如何正确处理此承诺?

来自分类Dev

Firebase函数如何正确处理错误

来自分类Dev

如何正确处理此SFINAE?

来自分类Dev

CSS堆叠顺序-如何正确处理?

来自分类Dev

AngularJS-如何正确处理承诺

来自分类Dev

如何正确处理SSLSocketImpl死锁?

来自分类Dev

如何正确处理python继承

来自分类Dev

Flask下的fork如何正确处理?

来自分类Dev

如何正确处理异步操作?

来自分类Dev

如何正确处理多个 if else 条件?

来自分类Dev

如何正确处理来自Winreg板条箱的Regvaule类型?

来自分类Dev

php & mysql:正确处理所有类型的查询