【问题标题】:Why does F# not like the type ('a list list) as input?为什么 F# 不喜欢将类型('a list list)作为输入?
【发布时间】:2019-12-01 21:04:36
【问题描述】:

*我编辑了我的原始帖子以包含更多信息。

我正在处理 F# 分配,我应该创建一个函数,该函数将“任何列表列表”作为输入并输出“任何列表”。它应该能够将列表列表连接成一个列表。

这是我的函数的样子:

let llst = [ [1] ; [2;3] ; ['d';'e';'f'] ]
let concat (llst:'a list list) : 'a list = 
    List.concat llst

List.iter (fun elem -> printf "%d " elem) concat

这个解决方案或多或少直接复制自微软使用 List.concat 函数的示例,唯一的例外是输入/输出类型的规范。

当我运行代码时,我得到这个错误:

concat.fsx(7,43): error FS0001: This expression was expected to have type
    ''a list'
but here has type
    ''b list list -> 'b list'

所以看来 concat 正在将我的 llst 变成一个字符列表,我不明白。

谁能帮我理解为什么会出现这种类型错误以及如何编写一个函数来获取我需要的类型?

【问题讨论】:

  • 添加concat的定义和调用concat的代码。到目前为止,您提供的代码不包括问题。
  • 您可能正在尝试重新实现List.collect,您可能需要先检查一下。试试let results = List.collect id myListOfLists
  • 我添加了更多代码,@Mankarse。
  • 消息说List.iter 的第二个参数应该是一个列表。 concat 不是列表。

标签: f#


【解决方案1】:

问题出在您对concat 函数的实现中。如果没有看到您的代码,很难说出确切的位置,但由于这是一项作业,实际上最好解释一下错误消息告诉您的内容,以便您自己找到问题。

错误消息告诉您,F# 类型推断算法在您的代码中找到了一个位置,您编写的内容的实际类型与该位置的预期类型不匹配。它还告诉您两种不匹配的类型是什么。例如,假设你写了这样的东西:

let concat (llst:'a list list) : 'a list = 
  llst

您将在第二行得到错误,因为 llst 的类型是 'a list list(编译器从您在第 1 行给出的类型注释中知道这一点),但预期的类型是相同的作为函数的结果类型 'a list - 也由您的类型注释指定。

所以,为了帮助您找到问题 - 查看您遇到错误的确切位置并尝试推断为什么编译器认为实际类型是 'a list list 并尝试理解为什么它期望 'a list 作为应该在这个地方的类型。

【讨论】:

    【解决方案2】:

    这是正确的:

    let concat (llst:'a list list) : 'a list = 
        List.concat llst
    

    不过,它真的等价于let concat = List.concat

    但是,这不会编译,列表的元素需要是相同的类型:

    let llst = [ [1] ; [2;3] ; ['d';'e';'f'] ]
    

    这也是有问题的:

    List.iter (fun elem -> printf "%d " elem) concat
    

    List.iter 有两个参数,第二个参数必须是List。但是,在您的情况下,您(根据编译器错误)提供了 concat 函数,该函数是 a' List List -> a' List

    我怀疑你的意思是首先将 concat 函数应用于你的llist

    List.iter (fun elem -> printf "%d " elem) (concat llist)
    // or
    llist
    |> concat
    |> List.iter (fun elem -> printf "%d " elem)
    

    但是,所有这些可能都没有抓住练习的重点。您可能需要做的是根据列表的空/非空状态实现一些简单的递归,即。从这里填空:

    let rec myconcat acc inlist =
        match inlist with
        | [] -> ??
        | elt :: tail -> ??
    

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 2019-11-12
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      相关资源
      最近更新 更多