【问题标题】:My Haskell programme to convert Sets to Lists is getting an error我将集合转换为列表的 Haskell 程序出现错误
【发布时间】:2020-04-21 15:28:44
【问题描述】:

我是一名初级程序员,我已经为我的集合创建了一个数据类型。然后我编写了一个函数将它们转换为列表,但我不断收到以下表达式错误消息:

toList 3 :-: 4 :-: 5 :-: Empty 
Non type-variable argument in the constraint: Num (Set a)
      (Use FlexibleContexts to permit this)

When checking the inferred type
        it :: forall a. (Num (Set a), Num [a]) => Set [a]

这是我的代码:

infixr 5 :-:
data Set a = Empty | a :-: (Set a) deriving (Show, Read, Eq, Ord)

toList :: Set a -> [a]
toList Empty = []
toList (x :-: xs) =  x : toList xs

【问题讨论】:

  • 我无法复制。这段代码根本没有提到Num,所以不清楚你的错误来自哪里。
  • 我尝试将函数 toList 应用于集合 3 :-: 4 :-: 5 :-: 空。不知道有没有用?
  • 请发布您在 GHCi 中输入的确切文本
  • toList 3 :-: 4 :-: 5 :-: 空
  • 这被解析为(toList 3) :-: 4 :-: 5 :-: Empty,所以4 成为Set a 的参数:-:。请改用toList (3 :-: 4 :-: 5 :-: Empty)

标签: list haskell types set


【解决方案1】:

问题是toList 3 :-: 4 :-: 5 :-: Empty 被解析为(toList 3) :-: 4 :-: 5 :-: Empty,但你实际上想要toList (3 :-: 4 :-: 5 :-: Empty)。要让它工作,你需要写后者,或者使用$,像这样:toList $ 3 :-: 4 :-: 5 :-: Empty

【讨论】:

  • 谢谢,效果很好。我可以在代码中更改什么以使程序按预期运行吗?
  • 你的意思是你想让toList 3 :-: 4 :-: 5 :-: Empty 做你想做的事而不需要我的改变?不,没有办法做到这一点。
  • 这个问题有点像问“我喜欢苹果”是否可以表达为“我讨厌咖啡”的意思
猜你喜欢
  • 1970-01-01
  • 2018-02-19
  • 2023-03-11
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 2013-12-16
  • 2016-01-05
  • 2017-02-06
相关资源
最近更新 更多