【问题标题】:Ocaml - expression has type 'a list -> 'b list but an expression was expected of type 'b listOcaml - 表达式的类型为 'a list -> 'b list 但表达式应为 'b list 类型
【发布时间】:2018-04-30 06:56:08
【问题描述】:

这是我的功能

let rec helper inputList = function
  | [] -> []
  | a :: b :: hd -> if a = b then helper ([b::hd]) else a :: helper (b:: hd)

它不完整,但是我不明白为什么我在帮助程序 ([b::hd]) 的标题中不断收到错误。我尝试过 helper (b::hd) 或 helper (b::hd::[]) 但是都出现了错误。我怎样才能让它发挥作用?

【问题讨论】:

  • 因为所有递归调用都会弹出列表的头部,所以最终该列表包含一个元素。

标签: functional-programming ocaml


【解决方案1】:

当您使用function 时,您正在为函数的参数提供模式。但是您已经有了一个名为inputList 的参数。所以这个函数helper 需要两个参数(但它忽略了第一个)。

您可以通过删除 inputList 来解决此问题。

您在第一次递归调用helper 时也遇到了问题。您的表达式[b :: hd] 是一个列表列表。我怀疑你想要的更像是 b :: hd 这里。

至少还有一个其他问题,但我希望这有助于您开始。

【讨论】:

    【解决方案2】:

    这里有多个错误。一个是关键字function 意味着我们有一个我们正在处理的隐式参数。所以模式匹配发生在那个“不可见”的参数上。但是在这里您定义的可能是明确的:inputList。所以我们可以删除那个:

    let rec helper = function
      | [] -> []
      | a :: b :: hd -> if a = b then helper ([b::hd]) else a :: helper (b:: hd)

    接下来是类型的问题:在递归中,你使用:

    1. helper ([b::hd]);和
    2. a :: helper (b:: hd)

    但是你把它们放在同一行,这是没有意义的,因为第一个传递一个 元素列表的列表,第二个传递一个 元素列表。所以第一个的结果将是一个元素列表的列表,第二个是一个元素的列表。合并这些没有意义。

    如果我理解正确,您希望确保不会出现两个相等的连续元素,那么我们应该将其重写为:

    let rec helper = function
      | [] -> []
      | a :: b :: hd -> if a = b then helper (b::hd) else a :: helper (b:: hd)

    您在这里定义了两种模式:

    1. 一个用于空列表;和
    2. 一个用于至少两个元素的列表。

    第二个将在列表b :: hd 的尾部执行递归。所以这意味着最终当我们向它传递一个带有 n 元素的列表时,它会递归地处理带有 n-1 元素的列表 n-2 em> 元素等。但最终它将只有一个元素。没有理由这样做。所以我们需要为单元素模式添加一个案例:

    let rec helper = function
      | [] -> []
      | h :: [] -> h :: []
      | a :: b :: hd -> if a = b then helper (b::hd) else a :: helper (b:: hd)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 2011-08-27
      • 2017-07-09
      • 1970-01-01
      • 2019-10-23
      • 2018-03-31
      • 1970-01-01
      相关资源
      最近更新 更多