【发布时间】:2011-08-19 11:47:14
【问题描述】:
假设我有一个复合数据类型 -
data M o = M (String,o)
现在,我可以定义一个适用于所有M 的函数,而与o 无关。比如——
f :: M o -> M o
f (M (s,o)) = M (s++"!", o)
但是,f 并不像我希望的那样普遍。特别是,在表达式中使用f 修复了o 的类型,因此我不能再次将f 与不同类型的o 一起使用。例如以下内容不进行类型检查 -
p f = undefined where
m1 = M ("1", ())
m2 = M ("2", True)
m1' = f m1
m2' = f m2
它会产生错误 - Couldn't match expected type 'Bool' with actual type '()'
令人惊讶的是,如果我不提供 f 作为参数,而是简单地使用 f 的全局定义,那么它可以编译并正常工作!即编译 -
p = undefined where
m1 = M ("1", ())
m2 = M ("2", True)
m1' = f m1
m2' = f m2
这有什么特别的原因吗?我该如何解决这个问题,即定义一个可以应用于所有(M o) 的函数f,即使o 在同一个表达式中变化?我猜存在类型在这里发挥作用,但我就是不知道如何。
【问题讨论】:
-
为什么要让 M 成为一个元组?多么丑陋。
-
默认情况下有些东西是“forall”,有些东西不是。你可能会看到这些文字:en.wikibooks.org/wiki/Haskell/Existentially_quantified_types
-
@monadic,这实际上只是一个最小的示例,它重现了我在实际代码中遇到的问题(这要复杂得多)。