- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
更广泛地说,这个问题是关于 expression problem 的各种方法。 .这个想法是您的程序是数据类型和对它的操作的组合。我们希望能够在不重新编译旧类的情况下添加新案例。
现在 Haskell 为 expression problem 提供了一些非常棒的解决方案。与 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
(defmulti area :Shape)
(defn rect [wd ht] {:Shape :Rect :wd wd :ht ht})
(defn circle [radius] {:Shape :Circle :radius radius})
(defmethod area :Rect [r]
(* (:wd r) (:ht r)))
(defmethod area :Circle [c]
(* (. Math PI) (* (:radius c) (:radius c))))
(defmethod area :default [x] :oops)
(def r (rect 4 13))
(def c (circle 12))
(area r)
-> 52
(area c)
-> 452.3893421169302
(area {})
-> :oops
(defprotocol P
(foo [x])
(bar-me [x] [x y]))
(deftype Foo [a b c]
P
(foo [x] a)
(bar-me [x] b)
(bar-me [x y] (+ c y)))
(bar-me (Foo. 1 2 3) 42)
=> 45
(foo
(let [x 42]
(reify P
(foo [this] 17)
(bar-me [this] x)
(bar-me [this y] x))))
=> 17
But, there are protocols and multi-methods. These are very powerful, but not as powerful as Haskell's typeclasses. You can introduce something like a typeclass by specifying your contract in a protocol. This only dispatches on the first argument, whereas Haskell can dispatch on the entire signature, including return value. Multi-methods are more powerful than protocols, but not as powerful as Haskell's dispatch.
最佳答案
很明显,协议(protocol)只能在第一个且只有第一个参数上分派(dispatch)。这意味着它们大致相当于
class Foo a where
bar :: a -> ...
quux :: a -> ...
...
a
必须是第一个参数。 Haskell 的类型类让
a
出现在函数的任何位置。因此,协议(protocol)的表达能力很容易不如类型类。
forall a. Foo a => a
Monoid
它有一个值
mempty :: Monoid m => m
.它不是一个函数,用 Clojure 模拟它是不可能的,因为我们没有任何关于我们应该选择什么方法的类型信息。
read :: Read a => String -> a
.在 Haskell 中,我们实际上可以创建一个类型为
[forall a. Read a => a]
的列表。 ,我们基本上推迟了计算,我们现在可以运行和重新运行列表中的元素,以尝试将它们读取为不同的值。
关于haskell - Clojure 中的协议(protocol)和多方法在多态性方面不如 Haskell 中的类型类强大的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22040115/
Stackoverflow JS Genius的! 我当前的项目有一个问题,它正在使用 Node 的HTTP createServer,并使用Formidable来解析主体数据。 请参阅下面的代码。
我正在尝试将文件上传到我的 NodeJS 服务器。我目前收到错误: 错误:错误的内容类型 header ,未知的内容类型:image/jpeg “image/jpeg”是有效的 MIME 类型,为什么
我有一个用作路由器的 Node.JS 服务器,可以向它发出 post 请求以上传文件,应该只允许 jpg/png/jpeg 扩展名我目前正在做的是: var form = new formidable
我正在使用https://github.com/felixge/node-formidable用于使用express上传文件。 虽然它工作得很好,但有一个问题:我有一个包含 9 个 type="fil
Haskell 的类型推理引擎比 Scala 的类型推理引擎强大得多。在 Haskell 中,我很少需要显式编写类型,而在 Scala 中,类型只能在表达式中推断,而不能在方法定义中推断。 例如,请参
我将 Superpowered 用于各种实时 FX,它们都非常简单。然而,音高变换是另一回事,我认为事实上是因为它基于时间拉伸(stretch)算法,当然必须处理随时间变化的输出,这比应用 EQ 或混
我正在使用mean stack 和formidable上传文件 表单具有 multipart/form-data 属性 exports.create = function(req, res) {
我正在尝试构建我的第一个 node.js 应用程序,但是,使用 node server.js 运行时,我收到以下错误消息: connect: multipart: use parser (multip
对于强大的 npm 包,当我使用 import * as formidable from "formidable" 时,我收到一条错误消息,指出 formidable({ multiples: tru
我注意到了 std::string str; str += 'b'; // works str.append('b'); // does not work str.append(1, 'b'); //
我有一个需要访问本地 FS 的 HTML/JS(YUI 框架)照片管理器。我应该将 HTML/JS 移动到 AIR,还是硬着头皮将其“移植”到 Flex AIR? 我知道营销说的是什么,但我想要真正的
我是一名优秀的程序员,十分优秀!