haskell - 在 Haskell 类型签名中作为约束变量列出?
问题描述
而不是声明此类型签名:
g :: Enum a => [a] -> [a]
我想使用这种风格:
h :: (Enum a, Functor f) => f a -> f a
除了换Functor
出[]
. (例如,因为我可能很高兴暂时在我的实施中不那么笼统)。
虽然我想,但我不能使用以下,
i :: (Enum a, [] f) => f a -> f a
-- compilation error: Expected kind ‘* -> *’, but ‘f’ has kind ‘*’
因为 the[] f
可能被解释为 的列表f
,而不是f
被解释为某事物列表的约束变量。
以下工作,但我想知道是否可以将 List 声明为 Haskell 类型签名中的实际约束变量。
j :: (Enum a) => [] a -> [] a
解决方案
您可以将等式约束声明为
g :: (Enum a, [] ~ f) => f a -> f a
在合适的语言扩展下。将运算符读取(~)
为相等或全等。
在 GHC 命令行中设置
-XGADTs
或设置其中之一。-XTypeFamilies
或者,放置任何一个
{-# LANGUAGE GADTs #-} {-# LANGUAGE TypeFamilies #-}
在文件的顶部。
不过,真的值得吗?
推荐阅读
- reactjs - 从 ReactJs 中的 API 一次获取所有页面
- javascript - Web Crypto API 在 AES 解密时抛出“DOMException”
- json - 如何使用 jq 创建具有多个标题和详细信息行的 CSV?
- python - 什么需要更多内存,一个 8 字符字符串或 8 位整数?
- ios - 如何使用Out更改设备语言,iOS快速(从应用程序内部)更改应用程序语言运行时
- javascript - 自定义基于 struts 的应用程序以使用 spring boot 微服务(仅 jSP)
- swift - 使“MyModel”的实例符合“可识别”协议
- openmp - 在 OMP 中为嵌套的 for 循环使用不同的线程
- python - 类不返回其功能之一
- java - 如果其他条件未设置属性,则 logback