更广泛地说,这个问题是关于表达问题的各种方法.我们的想法是,您的程序是数据类型和操作的组合.我们希望能够在不重新编译旧类的情况下添加新案例.
现在,Haskell 对TypeClass的表达式问题有一些非常棒的解决方案.特别是 - 我们可以这样做:
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
member :: (Eq a) => a -> [a] -> Bool
member y [] = False
member y (x:xs) = (x == y) || member y xs
Run Code Online (Sandbox Code Playgroud)
现在Clojure中还有多方法 -所以你可以这样做:
(defmulti area :Shape)
(defn rect [wd ht] {:Shape :Rect :wd wd :ht ht})
(defn circle [radius] {:Shape :Circle :radius radius})
(defmethod area …Run Code Online (Sandbox Code Playgroud) 最后,给定足够的宏魔法可以做到这一点......但现在可能比在Clojure上实现Haskell风格类型系统更省力.类型化的Clojure可能是一个很好的模型,除了它已被明确设计,以便Clojure的语义不受推断类型的影响.这正是返回类型多态中发生的事情,因此在Typed Clojure中显然是不可能的.
我的问题是 - 什么意思(Haskell的)语义受推断类型(返回类型多态)的影响?