Clojure中的多态模式

Clojure中的多态模式,clojure,schema,plumatic-schema,Clojure,Schema,Plumatic Schema,我想创建多态模式/类型,我对最佳实践很好奇。以下两个示例允许我创建一个频率模式,该模式可以逐月逐日重复事件,或逐月逐日重复事件(例如,分别为每15日或每第一个星期一) 第一种是使用实验性的抽象映射来完成的,它的语法是笨拙的(IMO)。另外,在实验包中,我有点担心 第二种方法使用s/conditional,这是因为无法将type的值从字符串强制到关键字,这在处理RESTAPI或JSON时非常有用。(而s/eq对这一点非常有用) 在一般情况下,以下哪一种或第三种方案是传达以下信息的最佳实践:类型A是

我想创建多态模式/类型,我对最佳实践很好奇。以下两个示例允许我创建一个
频率
模式,该模式可以逐月逐日重复事件
,或逐月逐日重复事件
(例如,分别为每15日或每第一个星期一)

第一种是使用实验性的抽象映射来完成的,它的语法是笨拙的(IMO)。另外,在实验包中,我有点担心

第二种方法使用
s/conditional
,这是因为无法将
type
的值从
字符串
强制到
关键字
,这在处理RESTAPI或JSON时非常有用。(而
s/eq
对这一点非常有用)

在一般情况下,以下哪一种或第三种方案是传达以下信息的最佳实践:
类型A是类型#{B C D…}

两种选择:

;;OPTION 1
​
(s/defschema Frequency (field (abstract-map/abstract-map-schema
                               :type {})
                              {}))
(abstract-map/extend-schema MonthlyByDOM Frequency
                            [:monthly-by-dom]
                            {:days #{MonthDay}})
(abstract-map/extend-schema MonthlyByDOW Frequency
                            [:monthly-by-dow]
                            {:days  #{WeekDay}
                             :weeks #{(s/enum 1 2 3 4 5)}})

;;OPTION 2
​
(s/defschema MonthlyByDOM "monthly by day of month, eg every 13th and 21st day" {:type (s/eq :monthly-by-dom)
                                                                                 :days #{MonthDay}})
(s/defschema MonthlyByDOW "monthly by day of week, eg first, and third friday" {:type  (s/eq :monthly-by-dow)
                                                                                :days  #{WeekDay}
                                                                                :weeks #{(s/enum 1 2 3 4 5)}})
(s/defschema Frequency (field (s/conditional #(= (s/eq :monthly-by-dom) (do (prn %) (:type %))) MonthlyByDOM
                                             #(= :monthly-by-dow (:type %)) MonthlyByDOW)
                              {:default {:type :monthly-by-dom
                                         :days #{1 11 21}}}))
类似的问题也没什么帮助:


回答您的标签问题:有一个
棱柱模式
标签(我已经添加了它)。@PiotrekBzdyl啊,谢谢。我正在寻找
clojure模式
,非常感谢!