gpt4 book ai didi

Haskell:难以将上下文(Eq a)嵌入到数据声明中

转载 作者:行者123 更新时间:2023-12-03 14:49:10 25 4
gpt4 key购买 nike

我正在以下程序中编写一个简单的哈希树结构 hash_lookup.hs :

module Main where

data (Eq a) => HashTable a b = HashChildren (a, [HashTable a b]) | Hash (a, b) deriving (Show)

getKey :: HashTable a b -> a

getKey (HashChildren (k, hs)) = k
getKey (Hash (k, h)) = k

lookUp :: [a] -> HashTable a b -> Maybe (HashTable a b)

lookUp [] table = return table
lookUp _ (Hash _) = Nothing
lookUp (p:path) (HashChildren (_, ts) ) = lookUp path ( head ( dropWhile (\x -> (getKey x) /= p) ts ) )

getKey 旨在检索给定 HashTable 的根键,而 lookUp 需要一个字符串列表,并且旨在遵循它找到的第一个路径,直到它到达完整路径或失败(我知道这不是自然的)树的行为,但这是我的教程想要的)。

我有两个问题:
1) 为什么我会收到一条错误消息,告诉我 a /= a (从最后一行)是不允许的,因为有 No instance for (Eq a) (终端中的错误消息),尽管 (Eq a)在数据声明中?

2) 除了我得到的错误和查找函数看似奇怪的行为之外,这是好的还是惯用的 Haskell?

谢谢

最佳答案

Haskell 中常见的“陷阱”之一是,如果您将类约束放在 data 上声明,使用该类型的函数也必须具有类约束。为此,您的 data声明在 Haskell 中不是惯用的,您应该消除它的类约束。在 data 中声明类约束对您没有任何好处。无论如何声明。

基本上,函数类型 必须重复类约束。函数的用户如何知道他们必须使用相关类的实例?请注意,您可以拥有一个函数 f根据函数定义 g定义为 h这是根据您的 HashTable a b 定义的类型,使得 f没有提到你的 HashTable type ,但由于类型依赖性,它需要一个类型为 a 的参数间接并最终用作您 HashTable 的第一个参数类型。 f的类型 必须有类约束,Haskell 正确推断,如果缺少它,它将拒绝您的类型注释。

关于Haskell:难以将上下文(Eq a)嵌入到数据声明中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11193078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com