【发布时间】:2013-08-20 18:56:17
【问题描述】:
函数从字节流中读取 ID。它知道 id 的大小 - 可以是 4 或 8 个字节。如何使返回类型多态?
(伪代码:)
class (Integral a) => IdSize a where
size :: a -> Int
instance IdSize Int32 ...
instance IdSize Int64 ...
data Data = Data (Map (IdSize a) String)
readData :: Data (Map (IdSize a) String)
readId :: (forall a. IdSize a) => a -- kind of this, but not right
这个 readId 需要来自调用者的 IdSize 实例,但调用者不知道大小。同样,readData 返回的 Map 需要是多态的,但是调用者并不知道实际的类型。使用 Map 的函数将知道该类型。
【问题讨论】:
-
作为一个稻草人,在您声称需要“多态”的任何地方都使用
Either Int32 Int64怎么样? -
当然是多态的。在 Java 中,我可以声明一个返回类型 Object 并返回任何子类。在这里,我想表达一个类似的想法。调用者不会关心返回了什么,直到它把返回的值传递给一个可以计算出要做什么的函数。存在量化可以让我走上这条道路,但我需要进一步研究和实验,看看下一个问题是什么。 :)
标签: haskell parametric-polymorphism