【问题标题】:Couldn't match expected type of Haskell function无法匹配预期的 Haskell 函数类型
【发布时间】:2020-09-05 23:49:12
【问题描述】:

所以我对 haskell 非常陌生,我们已经设置了一些课程来使用函数式编程创建算法。所以我尝试制作一个函数,它接受一个整数数组并将每个数字分隔成一个列表。但是,我不断收到相同的错误,即预期类型与实际类型不同,即使在对其进行了一些研究之后,我也不明白这意味着什么。我已经尝试制作一些产生此错误的函数,所以有人可以指出我到底做错了什么以及为什么这个错误一直以外行的方式发生?

module Cswk2 where

getCard :: Integer -> [Integer]
getCard n
      | n < 0 = []
      | otherwise = lst_numb : getCard pre_numb
       where
         (pre_numb, lst_numb) = n divMod 10

【问题讨论】:

  • 对于 Haskell 初学者来说似乎是一个很好的尝试——唯一的问题是,正如威廉在他的回答中指出的那样,你忘记了 divMod 周围的反引号

标签: haskell types functional-programming


【解决方案1】:

n divMod 10 表达式没有意义,因为n 在这里是一个Integer,因此您不能使用n 函数和divMod 参数执行函数应用。

你可以用divMod n 10调用函数,所以:

getCard :: Integer -> [Integer]
getCard n
    | n < 0 = []
    | otherwise = lst_numb : getCard pre_numb
    where (pre_numb, lst_numb) = divMod n 10

或者您可以使用反引号将divMod 用作中缀运算符:

getCard :: Integer -> [Integer]
getCard n
    | n < 0 = []
    | otherwise = lst_numb : getCard pre_numb
    where (pre_numb, lst_numb) = n `divMod` 10

【讨论】:

  • 谢谢你,我花了这么长时间觉得很傻,但这很有意义
  • @CadyOG:好吧,就像 Robin 说的,这看起来已经很不错了。学习语法在某种程度上就像学习自然语言一样,需要一些练习:)
  • 如果您不介意我再问一个问题,我将使用 quickCheck 作为 cswk 要求来测试我的功能。将列表反转两次并获得相同的值是我唯一可以检查的属性吗?
  • @CadyOG: 你可以在这里试试看是不是getCard x == reverse (map read . show x),所以看看是不是数字反了。
  • @CadyOG 您可以考虑检查的一些快速想到的属性:所有结果数字都在 0-9 中; (尚未实现的)反函数 ungetCard :: [Integer] -&gt; Integer 与它往返;结果列表的长度接近数字的日志(以 10 为底)。如果你想一想,我敢肯定还有很多其他的属性可以做。
猜你喜欢
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2020-03-17
  • 1970-01-01
  • 2016-05-01
相关资源
最近更新 更多