是否可以使用范围类型语句?

时间:2012-01-11 15:30:34

标签: haskell

是否可以执行以下操作:

foo = bar
    where
        type A = (Some, Huge, Type, Sig)

        meh :: A -> (A, A) -> A

我只需要在where子句中使用这个自定义类型,因此全局定义它是没有意义的。

2 个答案:

答案 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所暗示的那样。