F# 交互式 CsvProvider 未定义。

4
我正在交互式控制台中加载FSharp.Data。该库已经顺利加载:
> #r "FSharp.Data.dll";;

--> Referenced 'C:\Users\pw\AppData\Local\Temp\FSharp.Data.dll' (file may be locked by F# Interactive process)

> open FSharp.Data;;

然而,当我尝试初始化CsvProvider(定义在FSharp.Data中)时,出现类型未定义的错误消息:

> type Stocks = CsvProvider<"C:\Users\pw\Downloads\msft.csv">;;

type Stocks = CsvProvider<"C:\Users\pw\Downloads\msft.csv">;;
--------------^^^^^^^^^^^

stdin(62,15): error FS0039: The type 'CsvProvider' is not defined

我认为问题可能是文件和程序集路径,但现在我正在使用绝对路径,并且错误仍然存在。另一方面,当我创建标准而非交互式项目时,我可以使用CsvProvider。任何有助于在交互式会话中使其工作的帮助都将不胜感激。


这很奇怪 - 你正在运行哪个版本的F#? - Tomas Petricek
你尝试过双反斜杠吗:CsvProvider<"C:\Users\pw\Downloads\msft.csv">? - Alexan
2
我创建了一个项目,添加了NuGet FSharp.Data。然后点击FSharp.Data引用并发送到交互式窗口。这对我有效。 - Alexan
你是否缺少了 open FSharp.Data - Robert Jeppesen
它在我的机器上无法使用VS 2022。尽管TypeProviders很好,但每当我尝试使用它们时,我都无法让它们正常工作。与此处相同的错误,尝试了net6和net48以及两个脚本环境。 - citykid
显示剩余5条评论
2个回答

2

有关文件被锁定的警告看起来令人担忧。您是否可以将 FSharp.Data 复制到其他位置并使用绝对路径进行引用:

\#r @"C:\Poligon\packages\FSharp.Data.2.1.0\lib\net40\FSharp.Data.dll";;

我尝试了两件事情:1)将dll复制到中性目录,然后通过绝对路径引用它。2)我还在控制台中添加了一个NuGet管理器安装了dll的目录(使用#I指令),然后从那里引用它。在这两种情况下,都会出现“文件可能被F#交互进程锁定”的警告。不用说,我仍然无法在控制台中访问CsvProvider - PiotrWolkowski
有点冒险,但你能否使用“进程资源管理器”查看是哪个进程锁定了该文件?如果没有任何进程锁定,那么你可以使用“进程监视器”来监视在fsi运行时访问此文件的进程(可能是杀毒软件?)。 - MichalMa
当你在交互模式中引用dll时,你总是会收到这个锁定消息,这是正常的,只是意味着你不能修改生成该dll的项目。 - Alexan
@MichalMa,DLL和文件都被“devenv”锁定了,这是由我的Visual Studio实例和交互式控制台(“Fsi.exe”)所导致的,这是可以预料到的。 - PiotrWolkowski
我也遇到了同样的问题...即使所有引用都是通过绝对路径引用的,FSI 仍然抱怨“未定义类型 'CsvProvider'”。 重新启动 Visual Studio 解决了这个问题,因此可能表明存在锁定问题。 - ben

-1

将您的FSharp.Core降级到4.7,FSharp.Data降级到3.3.3。然后应该就可以正常工作了。


这个问题来自2014年,当时F#的版本是3.1。不确定FSharp.Data的版本是什么。 - PiotrWolkowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接