学习 F# 并尝试找出语法

时间:2021-06-03 00:23:00

标签: compiler-errors f#

我是 F# 新手,如果有人可以向我解释这个错误,请

[4; 5; 2; 7] :: 3;;

stdin(4,17): error FS0001: 这个表达式应该有类型 'int list list'
但这里有类型 'int'

2 个答案:

答案 0 :(得分:5)

错误消息有点令人困惑,但编译器认为您尝试做的是将 cons 的列表int 转换为整数,这是不可能的。

在 F# 中,:: 用于将左侧的元素添加到右侧的列表中。有关详细信息,请参阅 documentation。列表在 F# 中是单链接的,这意味着添加到 front 很简单,但添加到 end 就没有那么容易了。

要正确使用 ::,您应该反转表达式:3 :: [4;5;6;7]。这将产生 [3;4;5;6;7]

答案 1 :(得分:1)

  • stdin(4,17): 错误代码在第 4 行,字符 17(您只报告有问题的行,大概是您的代码中的第 4 行。)
  • char 17 指向 3 - 这是编译器抱怨的“表达式”的开始
  • 那个表达式被推断为类型 int(这是正确的)
  • preceeding 表达式是 int list ([4; 5; 2; 7]) 是 cons (::) 的 item - 前置到前面 - 到项目类型的列表 - 因此编译器推断并期望 int list 列表 - 即 int list list 即这样的事情会起作用: [4; 5; 2; 7] :: [[3 ]] 会产生 [[4; 5; 2; 7];[3 ]]
  • 所以它期望在 cons int list list 之后有一个 :: 类型,但看到一个 int 因此是错误消息。
  • 猜测您可能来自 C# 背景,您可能想要 3 :: [4; 5; 2; 7] 这将产生 [ 3 ; 4; 5; 2; 7]。现在项目类型为 int,项目类型列表为 int list,编译器很高兴。
相关问题