为什么GHC类型检查器不像看起来几乎相同的两个函数之一?

EmreSevinç

我正在尝试解决Haskell Book中第11章“代数数据类型”中的一章练习但是我陷入了类型错误,无法理解为什么一个非常相似的函数起作用,而另一个却不起作用。

这是我的开始方式:

type Digit = Char

type Presses = Int

data DaPhone =
  DaPhone [(Char, Digit, Presses)]
  deriving Show

myPhone :: DaPhone
myPhone =
  DaPhone [('a', '2', 1), ('b', '2', 2), ('c', '2', 3)]

reverseTaps :: DaPhone -> Char -> [(Digit, Presses)]
reverseTaps aPhone aChar = foldr f [] aPhone
  where f (c, d, p)
          | c == aChar = ((d, p):)
        f _         = id

并得到以下错误:

daPhone.hs:29:39: Couldn't match expected type ‘t0 (Char, Digit, Presses)’ …
                with actual type ‘DaPhone’
    In the third argument of ‘foldr’, namely ‘aPhone’
    In the expression: foldr f [] aPhone
Compilation failed.

但是,如果我尝试使用几乎相同的类型使用几乎相同的功能,例如:

myList :: [(Char, Char, Int)]
myList = [('a', '2', 1), ('b', '2', 2), ('c', '2', 3)]

myFunction :: [(Char, Char, Int)] -> Char -> [(Char, Int)]
myFunction aList aChar = foldr f [] aList
  where f (c, d, p)
          | c == aChar = ((d,p):)
        f _           = id

它可以按预期进行编译和工作:

λ> myFunction myList 'a'
[('2',1)]
λ> myFunction myList 'b'
[('2',2)]
λ> myFunction myList 'c'
[('2',3)]

那么,为什么在中会出现类型错误reverseTaps,这与之非常相似myFunction(我猜这是关于DaPhone的定义的,这意味着也许我需要在中进行更多的模式修补foldr,等等,但我无法确切地找到方法)。

数学兰花

在我看来,您只需要

myFunction (DaPhone aList) aChar = ...

解开DaPhone实际清单

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python-不知道为什么两个列表看起来相同(该函数中的一个正在更新)

为什么我收到类型错误,这两个代码对我来说看起来都一样

为什么两个看起来具有相同值的Excel单元格测试为不匹配?

Excel为什么将这两个看起来相同的单元格视为不同的单元格?

数组归约函数-为什么这两个(看起来是等效的)函数返回不同的对象

为什么它看起来像两个线程都在我的代码访问一个锁?

对于两个相同类型的用户定义对象,哈希码看起来不同

为什么两个goroutine的控制台输出看起来像同步

为什么firebase查询看起来不像列表?

多个看起来几乎相同但使用一些不同数据和函数的类

如何让函数返回具有相同项目类型的两个迭代器之一?

为什么两个代码看起来一样,但一个不起作用?Python链表数据结构2

当我尝试在同一图上绘制两个变量时,为什么我的图看起来像这样?

为什么我在GitHub上的代码预览之一看起来像纯文本?

Kotlin的Iterable和Sequence看起来完全一样。为什么需要两种类型?

两个微调器在同一活动中看起来有所不同

为什么我的TCP数据包看起来不像协议分析器的TCP数据包?

如何使 CSS 半透明的两个形状看起来像一个?

创建一个看起来像两个条形的渐变背景

如何叠加两个图像但将其定位使其看起来像一个?

两个几乎相同的功能。一个函数与Queue一起排队.jQuery效果对排队的函数不起作用。为什么?

为什么HTML链接看起来不像引导取消按钮

为什么我的SVG看起来不像波纹(关于feDisplacementMap过滤器)

为什么我的CSV看起来不像我需要的样子?

为什么Debian中的字体看起来不像Ubuntu中那么漂亮

从16.04升级后,为什么Ubuntu 17.10看起来不像它

在 Scala 中创建的图像看起来不像预期的那样。不知道为什么

两台相同的外接显示器,一个通过HDMI,另一个通过VGA。VGA上的文字看起来模糊

为什么最后一个数组列看起来像这样?