【问题标题】:Haskell howManyAboveAverage Couldn't Match Type ErrorHaskell howManyAboveAverage 无法匹配类型错误
【发布时间】:2017-04-04 15:38:00
【问题描述】:

我是一名 Haskell 初学者,目前正在阅读 The Craft of Functional Programming 第 2 版。书中的一个练习要求我编写一个averageThree 函数,我已经这样做了,然后使用averageThree 函数编写一个howManyAboveAverage 函数。

我对如何做到这一点有点坚持,但我发现了一个类似的问题here。我使用了我的代码中给出的解决方案,但是我收到了一个解析错误 [已修复]。

这是我的新代码:

averageThree :: Int -> Int -> Int -> Float
averageThree a b c = fromIntegral (a + b + c) / 3

howManyAverageThree :: Int -> Int -> Int -> Int
howManyAverageThree a b c = length $ filter (> avg) the_three
    where avg = averageThree a b c
          the_three = fromIntegral <$> [a,b,c]

编辑:新错误
错误跟踪:

[1 of 1] Compiling Main             ( average.hs, interpreted )

average.hs:7:36: Not in scope: `<$>'
Failed, modules loaded: none.

我使用 ghci 7.6.3 版本进行编译。由于我正在遵循教科书示例,因此我需要保留函数签名。如何修改此代码以使我不再收到上述错误?

【问题讨论】:

  • 我更新了我的答案以反映您的编辑,今后请不要移动问题上的球门柱!如果一个答案解决了您原来的问题,但又暴露了一个新问题,那么最好接受第一个问题的答案并针对您的新问题提出一个新问题。
  • 旁注:那本书看起来有点过时(它说要使用 Hugs)。我会研究一个更新的资源,它会让你更好地了解要做什么,并且会有更线性的学习曲线。我学会了使用“Learn you a Haskell”,并且听说过“Real World Haskell”的好消息。它们都是在线免费的。
  • 我也使用了 futurelearn 课程,但我发现最初的学习曲线太陡峭。这本书是由课程负责人推荐给我的,作为更渐进的介绍,然后再更深入地处理futurelearn。

标签: haskell


【解决方案1】:

在 Haskell 中,indentation does matter。您需要匹配 where 子句中的缩进:

howManyAverageThree :: Int -> Int -> Int -> Int
howManyAverageThree a b c = length $ filter (> avg) the_three
    where avg = averageThree a b c
          the_three = fromIntegral[a b c]

编辑: 对问题进行编辑后,您需要更仔细地查看the_three 的定义:

the_three = fromIntegral[a b c]

fromIntegral 的类型为 :: (Integral a, Num b) =&gt; a -&gt; b

如果你想让the_three 成为一个数字列表,你需要做一些事情。 首先,您的列表结构需要在其中包含,。其次,您需要将fromIntegral 映射到该列表的每个元素上。

import Control.Applicative((<$>))
....

the_three = fromIntegral <$> [a,b,c]

【讨论】:

  • 好的,我复制粘贴了您的回复,它给了我一个新错误,问题已更新为错误跟踪。我也不明白我的缩进出了什么问题, where 正好是 4 个空格,而 the_three 也正好是 4。我承认,自从您的解决方案修复以来,显然有些事情我只是不明白。
  • @KaiD 混合制表符和空格通常会导致一些问题,使事情看起来像是在排列,但实际上并非如此。
  • @KaiD where 只是开始块;它是为块设置所需缩进级别的下一个标记。因此将the_threewhere 对齐(正如您所说:两个缩进四个空格)是不正确的,因为您应该将the_threeavg 对齐(因此将the_three 缩进四个空格)到where 的开头,再加上六个空格来说明where␣)。
  • 那么我以后会更加小心缩进,谢谢丹尼尔,我不知道我会在以后的编码中忍受它。您上面的解决方案再次给了我一个不同的错误,问题已更新。
  • @jkeuhlen 这与标签无关,我不认为。他的所有编辑都没有包含带有标签的代码,并且他对代码的描述明确提到了空格。
猜你喜欢
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
相关资源
最近更新 更多