我只是从f#开始,所以对于某些人来说,这个问题似乎很容易。因此,我试图使用位于System.ServiceModel.Syndication命名空间中的SyndicationFeed。我在项目中添加了以下引用:System.ServiceModel和System.ServiceModel.Web。结果是它可以成功构建,但是当我切换到“ F#交互式”窗口时,出现错误,显示为“错误FS0039:未定义名称空间'ServiceModel'”。
我go了一下,我也应该添加对FSharp.PowerPack的引用,以摆脱此错误,但不幸的是,它没有帮助。各位,我指望您的帮助
我有一个finit.fsx文件要在fsi.exe启动时加载,如:
#r xxxx
type xx = xxx
module Util = 
   let cd path = xxxx
   ...
启动fsi.exe后,将其加载为
namespace FSI_0002
  module Util = begin
    val cd : string -> unit
  ...
  end
问题是我该如何使用module util?我不能open Util或cd直接使用.为了进一步困扰我,如果我把一个命名空间放在顶行,比如namespace Test,在fsi.exe中,它被加载为
namespace FSI_0002.Test
  val cd : string -> unit
  ...
在哪里Module Util?然后我必须open Test;;再Util.cd.
有没有办法在F#启动脚本中定义模块并自动打开模块?谢谢.
我创建了一个类型Person,如下所示,运行正常.
type Person = 
    { First: string; Last : string }
    override this.ToString() = sprintf "%s, %s" this.First this.Last
但是当我尝试按如下方式制作人员列表时.
let people = 
    new List<_>( 
        [|
            {First = "Bhushan"; Last = "Shinde"} 
            { First = "Abhi"; Last = "Jad"}
        |])
它给出了错误:没有构造函数可用于'List <'a>'类型
有人可以解释一下是什么问题吗?
谢谢.
我可以定义一个通用签名类型并定义一个实现该签名的函数:
[<Measure>] type ms
type timer<'a,'b> = ('a -> 'b) -> 'a -> 'b * int64<ms>;;
let timeit:timer<'a,'b> = fun f x -> ((f x), 1L<ms>);;
我也可以将该类型定义放在F#签名文件(.fsi)中.
module Utils =
    type timer<'a,'b> = ('a -> 'b) -> 'a -> 'b * int64<ms>
但是当我尝试在实现文件中使用该类型定义时,编译器会说"类型"计时器"未定义".
[<Measure>] type ms
module Utils =
    let timeit:timer<'a,'b> = fun f x -> ((f x), 1L<ms>);;
这是预期的行为吗?
如果我想在.NET项目中使用ActiveX,我使用Add Reference ...对话框将其添加为引用,它会生成实际引用的interop程序集.
但是如果我想使用F#Interactive中的ActiveX,我应该首先创建F#项目,添加ActiveX引用然后从F#引用生成的互操作程序集:
#r "obj\\Interop.MyActiveX.dll" 
或者可以直接引用它,例如在VB脚本中:
Set mydoc = CreateObject("MyActiveX")
或者在PowerShell中:
$mydoc = new-object -comobject MyActiveX
如何将obj列表转换为int类型.我试图使用下面的地图函数添加两个列表,但它不适用于obj列表.
let query f= 
 seq{
let cmd = new OleDbCommand( "SELECT *  FROM F" );
let conn = new OleDbConnection( @"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=D:\Users\df\Documents\Vfolio.accdb;
Persist Security Info=False;" )
conn.Open()
let DAdapt = new OleDbDataAdapter("SELECT * FROM F",conn)
let DTab = new DataSet()
let i= DAdapt.Fill(DTab)
let rowCol = DTab.Tables.[0].Rows
let rowCount = rowCol.Count
 for i in 0 .. (rowCount - 1) do
           yield f (rowCol.[i])
   }
 let u= query(fun row -> row.[0])
 let a= List.ofSeq u
 let v=query(fun row -> row.[1]) …有三种相同尺寸的seq
a:int   = {1,  2,  3,  4}
b:string= {"a","b","a","d"}
c:string= {"y","y","t","t"}
如何从seq:a条件创建新的seq
where b="a" and c="y"
我试图检查变量是否是某种类型,如下所示:
let s = "abc"
let isString = s :? string
但在F#interactive中,我收到以下错误:
error FS0016: The type 'string' does not have any proper subtypes and cannot be used as the source of a type test or runtime coercion.
为什么会这样?我希望isString是一个bool.
我正在研究这个F#wikibook,我对链接页面的函数组合部分中看到的内容感到困惑.
我能想出的最简单的例子如下:
// int -> int
let f x = x + x
// float -> float
let g x = x + 1.0
这可以.我很容易理解这些函数的类型,我可以在fsi中运行它们并确认它们采用并返回我在上面提到的类型的值.
如果我添加以下行,那么我看到变化我不太确定我理解.
// equivalent to f (g x)
let fog = f << g
我理解这一点的方式,它应该不起作用,因为f期望一个int,但g返回一个浮点数.
如果我在fsi中定义这个组合,我会得到预期的类型错误.如果我将所有这些放在.fsx文件中并将整个内容发送到fsi,则f的签名将变为float - > float.
我对以下内容感到困惑:
我尝试过搜索,但目前我还不太了解这些问题的答案.如果你能帮我指出解决这些问题的部分,我会很乐意接受RTFM.
我正在忙着学习F#而且正在玩耍Seq.fold.任何人都可以解释为什么以下两个调用基本上不相同,一个错误,另一个没有.
以这种方式调用:
Seq.fold (fun state input -> state + input) 0 Seq.ofList [1;2;3;4;5];;
导致以下错误:
error FS0001: This expression was expected to have type
    ''a -> 'b'
but here has type
    'int'
调用管道工作正常:
Seq.ofList [1;2;3;4;5] |> Seq.fold (fun state input -> state + input) 0;;
我猜我已经以某种方式采用了泛型函数并强制它只是int.
f# ×10
f#-interactive ×10
f#-data ×2
.net ×1
activex ×1
f#-scripting ×1
interop ×1
reference ×1
typechecking ×1
types ×1