是否可以为包含“空白”的 Haskell 值提供类型签名以供类型推断算法填充?
非常人为的上下文示例:
m = return ('I', (("don't", "really"), "care", ["what", "this"], "type"), "is")
b = isJust m
这行得通。isJust m
in的使用b
限制了m
to be的类型Maybe <something>
,而m
's 的定义限制了m
to be的类型<something> (Char, ((String, String), String, [String], String), String)
,编译器将这两条信息放在一起计算出精确的类型m
。
但是假设我没有对 应用任何Maybe
特定函数m
,所以我需要一个手动类型签名来停止return
多态。我不能这样说:
m :: Maybe a
m = return ('I', (("don't", "really"), "care", ["what", "this"], "type"), "is")
因为那是不正确的。类型并不Maybe a
适用于所有a
,它Maybe a
适用于a
我希望编译器推断的一些;程序中有足够的信息供编译器执行此操作,从我的第一个示例中我们可以看到,编译器能够将多个约束放在一起,其中没有单独的约束足以确定类型是什么,但是它们一起完全指定了类型。
我想要的是能够给出类似的类型m :: Maybe _
,其中的_
意思是“你弄清楚这里发生了什么”,而不是像m :: Maybe a
.
有什么办法可以说这样的话吗?我可以看到的替代方案是明确给出完整类型:
m :: Maybe (Char, ((String, String), String, [String], String), String)
m = return ('I', (("don't", "really"), "care", ["what", "this"], "type"), "is")
或者给表达式的一部分一个类型签名,它具有约束Maybe
类型签名的一部分而不是约束的效果a
,例如:
m = (return :: a -> Maybe a) ('I', (("don't", "really"), "care", ["what", "this"], "type"), "is")
或者在m
没有显式类型签名的情况下离开并引入未使用的额外定义来约束m
:
m = return ('I', (("don't", "really"), "care", ["what", "this"], "type"), "is")
b = isJust m
或者直接使用单态函数:
m = Just ('I', (("don't", "really"), "care", ["what", "this"], "type"), "is")
显然,这不是特定于Maybe
,也不是* -> *
类型构造函数的参数;我可以想象想说“这个值是一个单子,对于Int
某些单子”而不想说“这个值是任何单子的单子”,或者“这是一个来自其他类型的函数”而不是说“这是一个功能从任何其他类型`。Int
Int
Int
我最感兴趣的是是否有什么东西可以让我相当直接地声明像上面关于值的声明,出于可读性目的,而不是难以阅读的变通方法(比如为return
. 我知道,如果我的目标是简单地将额外的类型信息输入编译器以将其关闭关于模棱两可的类型变量,那么有无数种方法可以做到这一点。