相关疑难解决方法(0)

Clojure - 命名参数

Clojure是否有命名参数?如果是这样,请您提供一个小例子吗?

clojure

77
推荐指数
3
解决办法
2万
查看次数

在Clojure中表示总和类型(ab)的惯用方法

编辑.我现在的问题是:在静态类型语言中,通常使用什么惯用的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)

types clojure discriminated-union

19
推荐指数
5
解决办法
3315
查看次数

标签 统计

clojure ×2

discriminated-union ×1

types ×1