将推导类型单子操作纳入显式类型数据声明的技术问题
解决Haskell中推导类型字段的显式数据声明问题
嘿,我完全懂这种痛苦——面对那种嵌套得像千层饼一样的monad transformer栈类型,手动把完整类型写出来不仅容易写错,还特别折磨人!针对你遇到的问题,这里有几个实用的小技巧,能让GHC帮你自动推导那个讨厌的字段类型:
方法1:使用PartialTypeSignatures扩展
这是最直接的解决方案,GHC允许你用_作为类型占位符,它会自动根据你赋值的表达式推导对应的完整类型。
首先开启扩展:
{-# LANGUAGE PartialTypeSignatures #-}
然后就可以这样声明你的新数据类型:
data Thing = Thing { x :: Int } t = Thing { x = 42 } -- 你的复杂monad操作(示例保留原逻辑) action = return Nothing -- 用_代替y的类型,让GHC自动推导 data Thing' = Thing' { x :: Int, y :: _ } t' = Thing' { x = 42, y = action }
当你编译或者在GHCI里加载这段代码时,GHC会自动把_替换成action的实际类型(也就是你提到的m (Maybe (n ())))。如果想确认推导的类型是否正确,可以在GHCI里输入:info Thing',就能看到完整的类型定义了。
方法2:临时查类型再复用(适合需要明确确认的场景)
如果你想先看清action的完整类型再写,也可以在GHCI里先查询:
> :t action action :: m (Maybe (n ())) -- 这里会显示具体的完整参数化类型
不过这个方法还是需要手动复制类型,所以不如第一种方法省心,但适合你想精准把控类型的场景。
小提示
- 开启
PartialTypeSignatures后,GHC可能会给出未指定类型的警告,如果你想关闭这个警告,可以加上{-# OPTIONS_GHC -Wno-partial-type-signatures #-}。 - 这个扩展从GHC 8.0版本开始支持,现在大部分Haskell开发环境都能满足要求。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

