首页 > 解决方案 > 在 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

标签: haskell

解决方案


您可以将等式约束声明为

g :: (Enum a, [] ~ f) => f a -> f a

在合适的语言扩展下。将运算符读取(~)为相等或全等。

  • 在 GHC 命令行中设置-XGADTs或设置其中之一。-XTypeFamilies

  • 或者,放置任何一个

    {-# LANGUAGE GADTs #-}
    {-# LANGUAGE TypeFamilies #-}
    

    在文件的顶部。

不过,真的值得吗?


推荐阅读