【发布时间】:2020-07-29 06:46:22
【问题描述】:
我正在学习 F#。我来这里是因为我对价值限制有一些难以理解的事情。
这是我正在学习的书中的例子。
let mapFirst = List.map fst
自从我用 haskell 学习了 FP,我很确定这段代码会被很好地编译,但事实并非如此。它导致错误FS0030(抱歉,我无法复制粘贴 fsi 错误消息,因为它是用韩语编写的)。相反,我必须提供一个明确的论点,例如:
let mapFirst inp = List.map fst inp // or inp |> List.map fst
但是为什么呢?我认为通过上面的例子,编译器肯定可以推断给定值的类型:
val mapFirst : ('a * 'b) list -> 'a list
如果我提醒正确的话,我在haskell中调用了这个东西eta-conversion,上面两个例子完全一样。 (但也许不是完全)。为什么我要显式地为函数提供参数而不丢失任何信息?
我已经理解了类似的东西
let empties = Array.create 100 []
不会编译以及为什么,但我认为这与我的问题无关。
※我看了this question,但没有用。
【问题讨论】:
-
我在
let mapFirst = List.map fst上没有得到 FS0030。你在函数中还做了什么,你怎么称呼它?也许这与 FSI 特别有关? -
@Luaan 我只是在 fsi 中直接输入了
let mapFirst = List.map fst;;。
标签: f#