You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:13:21