相关疑难解决方法(0)

Clojure - 返回类型的派遣?(与Haskell Typeclasses一样富有表现力)

这是关于Clojure与其他语言(如Haskell)的表现力的问题.更广泛的问题是表达问题的解决方案

这个问题得出的结论是,一般来说Clojure协议(和多方法)的表达力要低于Haskell类型类,因为协议在第一个参数上调度,而Haskell类型类可以在返回类型上调度.(现在我认为这种推理非常有趣,并且没有兴趣开始语言大战.我只是对思想的清晰度感兴趣).

作为打破这种推理的一部分 - 我的问题是 - 我们不能制作一个Clojure多方法来调度返回类型(或类型提示).我想我们可以将以下表达式放入Clojure多方法中:

(= java.lang.String (:tag (meta #'my-string)))
Run Code Online (Sandbox Code Playgroud)

功能是:

(defn ^String my-string [] 
  "hello world")
Run Code Online (Sandbox Code Playgroud)

编辑:关键是我可以运行:

(meta #'my-string)
Run Code Online (Sandbox Code Playgroud)

并在没有功能评估的情况下获得以下结果:

{:arglists ([]), :ns #<Namespace push-price.core>, :name my-string, :column 1, 
:line 1, :file "/private/var/folders/0l/x6hr0t1j2hvcmm_sqq04vdym0000gn/T/form-
init7576840885484540032.clj", :tag java.lang.String}
Run Code Online (Sandbox Code Playgroud)

即我没有评估我的功能的预期类型的​​一些信息.


编辑3(2014年4月24日):

假设我有以下类型:(deftype string-type [])

(deftype int-type [])
Run Code Online (Sandbox Code Playgroud)

然后我根据这些类型定义了以下函数:

(defn #^{:return-type string-type} return-string [] 
  "I am returning a string")

(defn #^{:return-type int-type} return-int [] 
  42)
Run Code Online (Sandbox Code Playgroud)

现在我编写一个函数来调度它们的返回类型,如下所示:

(defn return-type-dispatch [fn-arg]
  (let [return-type (:return-type (meta fn-arg))]
    (cond 
     (= return-type …
Run Code Online (Sandbox Code Playgroud)

haskell clojure typeclass multimethod clojure-protocol

9
推荐指数
1
解决办法
564
查看次数

为什么返回类型多态中的Haskell推断类型会导致运行时错误?

我选择使用Haskell的原因在于其丰富的类型系统.这在编译时为我提供了有关我的程序的更多信息,帮助我确信它是合理的.

此外,Haskell似乎是一种处理表达式问题的最佳语言,因为Haskell类型类可以在返回类型上进行调度.(与Clojure协议相反 - 它只能在第一个参数上调度).

当我探索Haskell多态返回值函数时read:

read :: (Read a) => String -> a
Run Code Online (Sandbox Code Playgroud)

使用以下程序:

addFive :: Int -> Int
addFive x = x + 5

main :: IO ()
main = do
    print (addFive (read "11"))
    putStrLn (read "11")
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

Runtime error
...
prog: Prelude.read: no parse
Run Code Online (Sandbox Code Playgroud)

所以我似乎在使用高级类型系统的语言中获得运行时错误.

将其与Clojure中的等效代码进行对比:

(defn add-five [x] (+ 5 x))

(println (add-five (read-string "11")))
(println (read-string "11"))
Run Code Online (Sandbox Code Playgroud)

这给出了以下结果:

16
11
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么Haskell在返回类型多态中推断类型会导致运行时错误?不应该在编译时把它们拿起来吗?

polymorphism haskell clojure

0
推荐指数
1
解决办法
207
查看次数