我刚刚学习F#,在tryfsharp.org上玩的时候,我注意到如果我更改了这段代码:
[0..100]
|> List.sum
Run Code Online (Sandbox Code Playgroud)
至
["A"; "B"; "D"]
|> List.sum
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
The type 'string' does not support the operator 'get_Zero'
Run Code Online (Sandbox Code Playgroud)
(这是你可以在你的浏览器中运行/修改的脚本,虽然它似乎只适用于我的IE!)
当我检查List.sum的定义时 ; 它说类型必须有一个名为Zero的静态成员.这似乎解释了错误; 除了我无法在int上看到任何名为Zero的成员!
所以; 这个适用于整数的零成员在哪里?如果我输入int.,我也无法在intellisense中看到它,也不会在docs中看到它,因为int只是一个.NET System.Int32(它似乎没有静态Zero属性).
(注意:它确实在错误中说"运算符"而不是"成员";这可能是相关的;虽然List.sum定义只是说"成员").
可能重复:
F# - 两个列表的交叉乘积
在F#中有效地投影列表列表
我有一个函数,它接受两个整数列表,并返回一个包含所有笛卡儿积的列表.我认为我有正确的想法,但没有正确的实施.我可以得到一些指示吗?
let rec cartesian = function
| ([],[]) -> []
| (xs,[]) -> []
| ([],ys) -> []
| (x::xs,ys) -> List.map(fun y -> (x,y)::[]) cartesian (xs,ys)
Run Code Online (Sandbox Code Playgroud) 根据MSDN文档:
当设置为 false 时,禁用在交互式会话的输出中显示声明值。
然而,以下示例交互式会话似乎与该摘要相矛盾。
> let x = 42;;
val x : int = 42
> fsi.ShowDeclarationValues <- false;;
val it : unit = ()
> let y = 42;;
val y : int
Run Code Online (Sandbox Code Playgroud)
我没想到上面的最后一行。
我是不是误会了什么?谁能确认这是否是一个错误?
谢谢。
我正在编写一个类型提供程序,允许用户向其提供配置文件.我使用TP的内部配置对象来识别ResolutionFolder,我用它来获取配置文件的完全限定路径.大.
但是,在使用脚本时,我使用Paket的自动生成的加载脚本来加载我的依赖项.文件路径如下所示: -
.paket
|--.load
| |-- net452
| |-- main.group.fsx
|--src
|-- myscript.fsx
|-- config.json
Run Code Online (Sandbox Code Playgroud)
myscript.fsx包含我的脚本代码.config.json包含我将在脚本中创建的类型提供程序实例的配置.
在内部myscript.fsx我调用#load "..\.paket\.load\net452\main.group.fsx" 加载所有依赖项(包括我的TP本身),它工作正常.
然而
然后,当我尝试在脚本中进一步初始化类型提供程序时: -
type MyTPInstance = MyTp<myConfig = "config.json">
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,我的TP捕获并显示: -
The type provider reported an error: Unable to locate config file
"C:\Users\Isaac\Source\Repos\myRepo\.paket\load\net452\config.json"
Run Code Online (Sandbox Code Playgroud)
换句话说 - 看起来因为我从生活在另一个文件夹中的脚本引用了我的TP程序集,这是 FSI用作解析文件夹的文件夹 - 而不是正在运行的脚本的文件夹.我可以证明,这是问题,因为如果我的内容复制main.group.fsx到myscript.fsx直接(固定的路径,我当然包),这一切工作正常.
我怎样才能解决这个问题?其他人如何解决这个问题?
我在Visual Studio 2015中创建了一个新的F#控制台应用程序项目我创建了一个名为Calc.fs的简单新模块文件,如下所示:
module Calc
let add a b = a + b
Run Code Online (Sandbox Code Playgroud)
我将F#脚本文件添加到项目中,如下所示:
open Calc
let c = add 1 2
Run Code Online (Sandbox Code Playgroud)
我在脚本文件中收到以下编译器错误:
未定义名称空间或模块"Calc"
和
未定义值或构造函数"add"
为什么我的模块无法识别我的模块?我怎样才能解决这个问题?
请注意,我的脚本文件按照项目中文件的顺序显示在模块之后:
我喜欢F#,我想通过编写一些脚本来实现一些烦人任务的自动化.
我如何以与CMD或PowerShell相同的方式与其他程序交互,例如RoboCopy或iisreset或net?
我知道我可以自己做,System.Diagnostics.Process但很难做到正确(返回代码,标准流等).
必须有一个图书馆,任何建议?
使用 Visual Studio 2015 Update 3 和fsi.exeF# v4.0,我尝试运行此脚本:
//error.fsx
#if INTERACTIVE
let msg = "Interactive"
#else
let msg = "Not Interactive"
#endif
let add x y =
x + y
printfn "%d" (add 1 2)
Run Code Online (Sandbox Code Playgroud)
输出: error.fsx(12,15):错误 FS0039:未定义值或构造函数“add”
如果我然后注释掉#if- #else-#endif块,它工作正常:
// fixed.fsx
//#if INTERACTIVE
// let msg = "Interactive"
//#else
// let msg = "Not Interactive"
//#endif
let add x y =
x + y
printfn "%d" (add 1 2)
Run Code Online (Sandbox Code Playgroud)
输出: 3
我确定我做错了什么(而不是这是一个错误),但我一生都无法弄清楚如何进行这项工作。 …
我有这个代码由我的导师提供.我应该通过查找mergesort中的f#类型来修复它.当我尝试发送到交互式时,我得到一个错误.我问我的proffesor出了什么问题,他说这是由于课堂网站上的格式错误造成的.我已经尝试添加空格删除你命名的空格,但每次我得到一个
~vs4489.fsx(8,14):错误FS0588:阻止此'let'未完成.期待一个表达.
关于最后两种方法.我怎样才能解决这个问题?
这是代码
let rec merge = function
| ([], ys) -> ys
| (xs, []) -> xs
| (x::xs, y::ys) -> if x < y then x :: merge (xs, y::ys)
else y :: merge (x::xs, ys)
let rec split = function
| [] -> ([], [])
| [a] -> ([a], [])
| a::b::cs -> let (M,N) = split cs
(a::M, b::N)
let rec mergesort = function
| [] -> []
| L -> let (M, N) = …Run Code Online (Sandbox Code Playgroud) 我创建了一个类型Person,如下所示,运行正常.
type Person =
{ First: string; Last : string }
override this.ToString() = sprintf "%s, %s" this.First this.Last
Run Code Online (Sandbox Code Playgroud)
但是当我尝试按如下方式制作人员列表时.
let people =
new List<_>(
[|
{First = "Bhushan"; Last = "Shinde"}
{ First = "Abhi"; Last = "Jad"}
|])
Run Code Online (Sandbox Code Playgroud)
它给出了错误:没有构造函数可用于'List <'a>'类型
有人可以解释一下是什么问题吗?
谢谢.
我一直试图写一个curried函数"multvec",它使用u =(u1,u2,...,un)和v =(v1,v2,...,vn)并输出u1*v1 + u2*v2 + ... + un*vn.我认为我的逻辑大多是正确的(至少它会在其他语言中......)但我一直得到一个:
stdin(11,57): error FS0001: This expression was expected to have type
'a list
but here has type
'c list * 'd list -> 'b list
Run Code Online (Sandbox Code Playgroud)
代码如下:问题显然在最后一行的产品调用中.但是,我的印象是基本情况(x*y):: []只会产生一个列表,而不是它实际生成的列表.
let rec multvec xs ys = function
| [ ], [ ] -> failwith "Both lists cannot be empty"
| x::[ ], y::[ ] -> ( x * y )::[ ]
| x::xs, y::ys -> let product = multvec xs ys
( x * y …Run Code Online (Sandbox Code Playgroud) 我想实现一个函数,它将大小为n和列表作为输入.此函数会将列表切割为两个列表,一个是大小n,另一个是另一个列表.我是这门语言的新手,很难学习语法.
我遇到的主要问题是找到一种方法来表达列表的大小而不使用任何循环或可变变量.
任何人都可以给我一些指示吗?