编辑.我现在的问题是:在静态类型语言中,通常使用什么惯用的Clojure结构而不是sum类型?到目前为止的共识:如果行为可以统一使用协议,否则使用标记对/映射,在前后条件下放置必要的断言.
Clojure提供了许多表达产品类型的方法:矢量,地图,记录......,但是如何表示总和类型,也称为标记的联合和变体记录?像Either a bHaskell或Either[+A, +B]Scala中的东西.
我想到的第一件事就是带有特殊标签的地图:{:tag :left :value a}但是(:tag value)如果不存在条件,那么所有的代码都将被污染并处理特殊情况......我想要确保的是,那:tag是永远存在的,而且只能取指定的值中的一个,和对应的值是一致的同类型/行为,不能nil,有一个简单的方法,看看我注意到在代码中所有的情况下照顾.
我可以想到一个宏defrecord,但是对于总和类型:
; it creates a special record type and some helper functions
(defvariant Either
left Foo
right :bar)
; user.Either
(def x (left (Foo. "foo"))) ;; factory functions for every variant
; #user.Either{:variant :left :value #user.Foo{:name "foo"}}
(def y (right (Foo. "bar"))) ;; factory functions check types
; SomeException...
(def y (right …Run Code Online (Sandbox Code Playgroud)