如何调整Haskell构造函数的类型应用参数顺序
调整构造函数类型参数顺序的解决方案
要实现直接用DynamicF @a x进行模式匹配,你需要修改DynamicF'的构造函数定义,通过forall调整参数的可见性和顺序,把要显式指定的a放到最前面,同时让k和f变成可推导的隐式参数:
type DynamicF' :: k -> (k -> Type) -> Type data DynamicF' k f where DynamicF :: forall {k} {f} a. Typeable a => f a -> DynamicF' k f
这里的forall {k} {f} a表示:
{k}和{f}是隐式类型参数,可以通过上下文自动推导,不需要显式指定a是显式类型参数,可以在模式匹配时直接用@a指定
修改后,你的示例代码就可以去掉下划线,直接写:
data Showable a where Showable :: Show a => a -> Showable a f :: DynamicF Showable -> String f (DynamicF @a x) = g x where g :: Showable a -> String g (Showable y) = show y
如果不想把k和f都设为隐式,也可以只调整参数顺序,把a放到最前面,剩下的参数由推导补全:
type DynamicF' :: k -> (k -> Type) -> Type data DynamicF' k f where DynamicF :: forall a k f. Typeable a => f a -> DynamicF' k f
这种写法下,构造函数的参数顺序变为a、k、f,特化后k固定为Type,模式匹配时@a直接对应第一个参数,后面的k和f由类型推导自动处理,同样不需要写下划线。
内容的提问来源于stack exchange,提问作者Clinton
相关产品推荐
相关产品推荐

