Haskell中如何查找类型同义词?GHCi查询方法咨询
在Haskell中查看类型同义词的方法
当然有办法查看类型同义词的实际含义,GHCi里提供了专门的命令来帮你搞定这个问题,甚至能直接判断一个类型是不是同义词。
核心命令::info(缩写:i)
这是最实用的命令,不管是类型同义词、数据类型、类还是函数,用:info都能查到详细信息。对于类型同义词,它会直接显示这个同义词对应的底层类型,还会明确标注这是一个type synonym。
举个实际例子,在GHCi里定义一个类型同义词:
Prelude> type UserID = String Prelude> type Age = Int
然后用:info查看:
Prelude> :i UserID type UserID = String -- Defined at <interactive>:1:1 Prelude> :i Age type Age = Int -- Defined at <interactive>:2:1
一眼就能看到它们分别是String和Int的同义词。
如果是带参数的类型同义词,比如:
Prelude> type Map k v = [(k, v)]
执行:i Map会得到:
Prelude> :i Map type Map k v = [(k, v)] -- Defined at <interactive>:3:1
判断类型是否为同义词
用:info也能直接判断:
- 如果输出里显示
type X = ...,那这个类型就是同义词; - 如果是
data X = ...或者newtype X = ...,那就是普通的数据类型或新类型,不是同义词。
比如对比一下:
Prelude> newtype Score = Score Int Prelude> :i Score newtype Score = Score Int -- Defined at <interactive>:4:1
这里显示的是newtype,显然不是类型同义词。
小技巧:结合:type辅助验证
如果你想验证某个表达式的实际类型(绕过同义词),可以先用:type查看表达式的类型,再用:info拆解同义词。比如:
Prelude> :type ("u123" :: UserID) "u123" :: UserID Prelude> :i UserID type UserID = String -- Defined at <interactive>:1:1
这样就能确认UserID本质上就是String。
内容的提问来源于stack exchange,提问作者The Hoff
相关产品推荐
相关产品推荐

