是否可以执行以下操作:
foo = bar
where
type A = (Some, Huge, Type, Sig)
meh :: A -> (A, A) -> A
我只需要在where子句中使用这个自定义类型,因此全局定义它是没有意义的。
答案 0 :(得分:8)
这是不可能的。为什么不在函数上面定义它?您不必从模块中导出它(只需使用显式导出列表)。
顺便说一下,如果你确实有一个很大的类型,那么可能是你应该把它分解成更小部分的一个标志,特别是如果你有很多元组,如你的例子所示;数据类型更合适。
答案 1 :(得分:8)
实际上,有一种,有点荒谬的方式来估计这个:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ScopedTypeVariables #-}
foo :: forall abbrv. (abbrv ~ (Some, Huge, Type, Sig))
=> abbrv -> abbrv
foo x = meh x (x, x)
where meh :: abbrv -> (abbrv, abbrv) -> abbrv
meh x y = {- ... -}
我不能真正推荐启用两种语言扩展只是为了缩写签名中的类型,但是如果你已经在使用它们(或GADT而不是类型系列),我想它并没有真正伤害任何东西。 / p>
除了愚蠢之外,你应该考虑在这样的情况下重构你的类型,正如ehird所暗示的那样。