首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >理解“约束中的非类型变量参数”

理解“约束中的非类型变量参数”
EN

Stack Overflow用户
提问于 2018-09-04 08:12:00
回答 1查看 1.4K关注 0票数 1

我想要将我编写的trie数据类型转换为Data.Tree.Tree

我的trie类型如下所示:

代码语言:javascript
复制
import qualified Data.Map as DM

data Trie a = Node {
    label :: a,
    edges :: DM.Map a (Trie a),
    isFinal :: Bool
}

现在我编写了这个函数来进行转换:

代码语言:javascript
复制
import qualified Data.Tree as DT

toDataTree :: (Eq a, Eq (Trie a)) => Trie a -> DT.Tree a
toDataTree (Node label edges isFinal)
    | edges == DM.empty = DT.Node label (map toDataTree (DM.elems edges))
    | otherwise = DT.Node label []

但是它不能编译。我得到了

代码语言:javascript
复制
    • Non type-variable argument in the constraint: Eq (Trie a)
      (Use FlexibleContexts to permit this)
    • In the type signature:
        toDataTree :: (Eq a, Eq (Trie a)) => Trie a -> DT.Tree a
   |
19 | toDataTree :: (Eq a, Eq (Trie a)) => Trie a -> DT.Tree a
   |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Failed, no modules loaded.

据我所知,我不理解那个错误消息和我在谷歌上搜索错误时发现的其他问题,这些问题并不能真正转移到我的代码中。

在这种情况下,这个错误意味着什么?是什么导致了它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-04 08:32:42

在普通的Haskell2010中,约束只能应用于类型变量,如ab等,但不能应用于任何更复杂的变量。

法律:Show a => a -> String

非法:Show (Maybe a) => a -> String

在本例中,因为Maybe a不是类型变量,所以Show (Maybe a)约束是非法的。a是类型变量,但Maybe a不是。

在您的代码中,编译器抱怨Trie a不是constraint Eq (Trie a)中的类型变量。

由于没有合理的技术理由不允许这样的约束,除了它更难实现之外,一个名为FlexibleContexts的扩展被引入(参见docs),它使这样的约束合法。这就是编译器告诉你的。你可以打开这个扩展,它没有任何缺点。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52157295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档