【问题标题】:Creating an instance for a typeclass throws :"Couldn't match expected type ‘f’ with actual type"为类型类创建实例抛出:“无法将预期类型‘f’与实际类型匹配”
【发布时间】:2016-07-27 01:46:24
【问题描述】:

我是 Haskell 的新手,我正在尝试学习如何使用 classe,

我有课:

class SomeClass f where
doSome :: Integer -> f

数据类型:

 data SomeData = D1 Integer 
                | D2 SomeData SomeData 

我正在尝试创建实例:

instance SomeClass SomeData where
doSome x = D1 x

但是 ghci 给了我错误:

无法将预期类型“f”与实际类型“SomeClass”匹配

我已经看到一些关于这个问题的问题,但我无法让它们为我工作。

我该如何解决这个问题?

【问题讨论】:

  • 缩进是错误的,我真的怀疑你的方法被命名为do。你能提供你的实际代码吗?
  • @Red Barton Tnx! - 你是对的,我的缩进是错误的(名字也是,我编辑了我的问题以反映这一点,但这不是重要的部分)。修复它后,它按预期编译和运行(arrr 错误代码根本没有用)
  • @Red Barton 这会教我在“where”子句后缩进
  • 好的,太好了。我必须承认,我从来没有想过在函数的类型签名和它的定义之间放置一个实例声明在语法上是有效的。
  • 不要用修复更新问题......现在看起来你问“我有[这里的代码完美运行],为什么它不起作用?”

标签: haskell


【解决方案1】:

D2之后使用D1在这里是无效的:

data SomeData = D1 Integer 
                | D2 D1 D1
                     ^^^^^

如果D1 出现在D2 之后,您需要一个类型,但D1 是一个函数。

你可能想写:

data SomeData = D1 Integer 
                | D2 SomeData SomeData

通过此更改,您的代码可以编译。 (我还将名称 do 更改为另一个不是 Haskell 关键字的名称):

data SomeData = D1 Integer | D2 SomeData SomeData

class SomeClass f where
  foo :: Integer -> f

instance SomeClass SomeData where
  foo x = D1 x

【讨论】:

  • 问题出在缩进上(我的代码和你的一样,除了缩进...),求帮助!!
猜你喜欢
  • 2015-04-15
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 2019-04-23
  • 2020-02-29
相关资源
最近更新 更多