我主要在Linux上玩F#,并希望默认引用所有必需的GUI库(Gtk,Gdk,Atk,Glib,Pango,Cairo),以便我可以简单地使用:
open Gtk;;
无需任何额外的输入.我最好的猜测是修改fsi启动脚本,目前看起来像这样:
#!/bin/sh
exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe $@
Run Code Online (Sandbox Code Playgroud)
更新:脚本的工作版本,如Stephen的建议:
#!/bin/sh
exec /usr/bin/mono /usr/local/src/fsharp/bin/fsi.exe -r "/usr/lib/cli/atk-sharp-2.0/atk-sharp.dll" -r "/usr/lib/cli/glib-sharp-2.0/glib-sharp.dll" -r "/usr/lib/cli/gdk-sharp-2.0/gdk-sharp.dll" -r "/usr/lib/cli/gtk-sharp-2.0/gtk-sharp.dll" -r "/usr/lib/cli/pango-sharp-2.0/pango-sharp.dll" -r "/usr/lib/mono/2.0/Mono.Cairo.dll" $@
Run Code Online (Sandbox Code Playgroud) 更新:尝试11月CTP发布.相同的错误消息.忘记提到这台服务器安装了Ubuntu服务器版.我在运行Desktop 10.10的Ubuntu桌面上没有此问题.所以我怀疑它可能是一些命令行相关的库缺失.安装libreadline-dev和libreadline5后,错误消息消失了.然而,fsi卡住的问题仍然存在.
Update2:尝试了新的Mono 2.8.1.同样的FSI问题.
Update3:由于此问题非常可重现,我将其报告为fsi.exe中的一个错误.让我们看看它是怎么回事.
Update4:Don Syme快速响应.他建议的解决方案解决了这个问题.我自己创造了答案.
嗨,
我在运行Ubuntu 10.10和Mono 2.8的服务器上安装了F#2.0.fsc.exe运行完美,我在编译fs文件时没有问题.但是,当我按如下方式运行fsi.exe时:mono /usr/local/FSharp/bin/fsi.exe
我收到了FSI提示,但错误信息不断重复
"无法安装ctrl-c处理程序 - Ctrl-C处理将无法使用.错误是:调用目标已抛出异常"
我在这里错过了什么吗?
Mono 2.8是从源代码编译和安装的.
我想在F#中找到没有.NET的数组中的最大值,最小值和平均值.我使用了这段代码,但它没有用:
let mutable max = 0
let arrX = [|9; 11; 3; 4; 5; 6; 7; 8|]
for i in 0 .. arrX.Length - 2 do
if (arrX.[i]) < (arrX.[i+1]) then
max <- arrX.[i]
printfn "%i" max
Run Code Online (Sandbox Code Playgroud) 在阅读John Palmer的答案时,可变值与不可变值重新定义之间的区别是什么?,约翰指出
这种重新定义只适用于fsi.
在使用F#Interactive(fsi)时,我想我下意识地知道它,但从未注意过它.
现在很明显,为什么差异?
更具体地说,请解释fsi和编译器之间的内部结构是如何不同的,这是通过设计或差异的结果发生的?
如果答案可以详细说明持有绑定的内部结构,那将是值得赞赏的.
我想在fsi中运行一个脚本.我收到以下错误.
无法加载文件或程序集'FSharp.Core,Version = 4.3.1.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一.该系统找不到指定的文件.
我发现以下引用建议我可能必须在Visual Studio中的某处更新默认的FSharp.Core版本,使用nuget下载包是不够的.
我不知道如何解决这个问题,我担心永久性地损坏vs配置.
因此,在Project AB中,我有FileA.fs和FileB.fs.FileB使用FileA中的定义,FileA和FileB都使用Project C中的定义(用C#编写).
在FileA.FS中,我有:
#if COMPILED
namespace ProjectAB
#else
#I "bin\debug"
#r "ProjectZ.dll"
#endif
Run Code Online (Sandbox Code Playgroud)
......它的运作方式如何 - 我可以用F#-Interactive运行整个文件,这很棒.
在FileB.fs中,我的标题是:
#if COMPILED
module ProjectAB.ModuleB
#else
#load "FileA.fs"
#I "bin\debug"
#r "ProjectZ.dll"
#endif
Run Code Online (Sandbox Code Playgroud)
但是当我运行它(从FileB),我得到错误:
FileA.fs(6,1): error FS0222: Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'. Only the last source file of an application may omit such a declaration.
Run Code Online (Sandbox Code Playgroud)
根据fsi.exe引用,#load指令"读取源文件,编译并运行它".但似乎必须在没有定义COMPILED指令的情况下这样做,因为它没有看到"命名空间ProjectAB"声明.
如何设置标题以便我可以在F#中运行任一文件?
编辑下面的每个latkin的答案,我创建了一个脚本作为项目中的最后一个文件_TestScript.fsx.我从其他文件中删除了所有预编译器的东西,并将其设置为.fsx文件的标头:
#if INTERACTIVE
#I "bin\debug"
#r "ProjectZ.dll"
#load "FileA.fs"
#load …Run Code Online (Sandbox Code Playgroud) 嗨,我用f#和Windows窗体制作了一个简单的程序,如何构建exe,然后将其发送给朋友进行测试?在调试文件夹中,我什么也没找到。
通过引用默认的WPF DLL,使用仅代码的WPF可以轻松完成任何操作:
#r "PresentationCore.dll"
#r "PresentationFramework.dll"
// ...other DLLs...
#r "WindowsBase.dll"
let window = System.Windows.Window()
let panel = System.Windows.Controls.StackPanel()
let button = System.Windows.Controls.Button()
panel.Children.Add button
button.Content <- "hi"
window.Content <- panel
window.Show()
Run Code Online (Sandbox Code Playgroud)
......当窗口仍然打开时你可以操纵它......
button.Click.Add (fun _ ->
button.Content <-
button.Content :?> string |> fun x -> (x + "!") :> obj)
Run Code Online (Sandbox Code Playgroud)
...然后单击按钮以查看其工作情况.这似乎是构建UI组件的一种非常强大的方法.
有没有办法用Windows.UI命名空间/控件/ UI框架做同样的事情 - 在F#interactive中加载一些程序集并动态实例化UI组件?
我天真地尝试引用似乎相关的文件:
#r @"C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.UniversalApiContract\2.0.0.0\Windows.Foundation.UniversalApiContract.winmd"
#r @"C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.FoundationContract\2.0.0.0\Windows.Foundation.FoundationContract.winmd"
Run Code Online (Sandbox Code Playgroud)
...这样做可以让我智能地进入Windows.UI命名空间.但是当我尝试实例化时:
Windows.UI.Xaml.Application()
Run Code Online (Sandbox Code Playgroud)
我明白了:
error FS0193: Could not load file or assembly 'file:///C:\Program Files …
我有一段代码在MailboxProcessor收到消息时向数据库添加一行.它在fsi中运行时可以正常工作,但在编译为exe时会挂起.脚本如下:
#r "../packages/Newtonsoft.Json/lib/net40/Newtonsoft.Json.dll"
#r "../packages/SQLProvider/lib/FSharp.Data.SqlProvider.dll"
open Newtonsoft.Json
open FSharp.Data.Sql
open System
let [<Literal>] ResolutionPath = __SOURCE_DIRECTORY__ + "/../build/"
let [<Literal>] ConnectionString = "Data Source=" + __SOURCE_DIRECTORY__ + @"/test.db;Version=3"
// test.db is initialized as follows:
//
// BEGIN TRANSACTION;
// CREATE TABLE "Events" (
// `id`INTEGER PRIMARY KEY AUTOINCREMENT,
// `timestamp` DATETIME NOT NULL
// );
// COMMIT;
type Sql = SqlDataProvider<
ConnectionString = ConnectionString,
DatabaseVendor = Common.DatabaseProviderTypes.SQLITE,
ResolutionPath = ResolutionPath,
IndividualsAmount = 1000,
UseOptionTypes = true >
let …Run Code Online (Sandbox Code Playgroud) 在VSCode中使用Fsi时遇到问题.我从1.7开始就遇到过这个问题,并且它仍然存在于1.8的当前版本中.
如果我alt + enter用来向VSCode发送代码选择它可以工作,但只能用于短选择.当选择太长时,它在Fsi窗口中不起作用.
我在使用Terminal和Fsi并粘贴一部分文本时发现了同样的问题.
我找不到字符或行限制.我有例如尝试在38行上粘贴1415个字符并且它有效.38行上的1416对我的一个文件不起作用.但是,当我粘贴1568个"a"字符时,它可以工作,而1569则没有.所以它不一定是字符限制.当我输入一些换行符时,这有效:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Run Code Online (Sandbox Code Playgroud)
最后添加另一个,但不是(1534个字符,35行).
它真的很烦人,我找到的唯一解决方法是将小部分代码分别复制到Fsi中,然后执行它们;;.
我在Windows 7,VSCode 1.8.1,ionide-fsharp 2.21.0,F#4.0.换行符计为2个字符(\ r \n).
写下这些数字,显然只有a我们需要的换行符characters + newlines < 1569.但它并不适用于任意其他角色.
f# ×10
f#-interactive ×10
mono ×2
bash ×1
compilation ×1
fsi ×1
gtk# ×1
immutability ×1
ionide ×1
release ×1
ubuntu ×1
uwp ×1
uwp-xaml ×1