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