所以我正在研究一些示例F#代码,并遇到以下片段:
let divRem a b =
let x = a / b
let y = a % b
(x,y)
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,我收到以下错误:
HelloWorld\Program.fs(15,14):错误FS0071:对类型推断变量应用默认类型"int*int"时,类型约束不匹配.类型'(int*int)'不支持任何名为'/'的运算符.考虑添加更多类型约束
但是,做类似的事情
let print n = System.Console.WriteLine(n.ToString())
print (4/2)
Run Code Online (Sandbox Code Playgroud)
结果是
2
为什么整数除法运算在函数定义中不可用?
编辑: 这是无法编译的代码的完整示例.
let divRem a b =
let x = a / b
let y = a % b
(x,y)
let print n = System.Console.WriteLine(n.ToString())
print (divRem (5,3))
Run Code Online (Sandbox Code Playgroud) 你会推荐任何凸优化库吗?
理想的开源.半定规划和QCQP的先验.
(我打算用fsharp和任何dotnet一起使用它)
我有一个F#DLL和一个C#DLL.
C#库有一个名称空间Library,其类Toolbox包含如下所示的成员FUND_BITS:
namespace Library {
public static class Toolbox {
public static uint FUND_BITS = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在F#库中我有一个绑定:
let bf = Library.Toolbox.FUND_BITS
Run Code Online (Sandbox Code Playgroud)
现在,我使用bf了库中定义的几个函数.当我改变值时FUND_BITS,我希望所有的F#函数都会使用更新的值,因为我已经绑定bf引用Library.Toolbox.FUND_BITS,并且没有声明它是一个可变副本或任何东西.但是,我发现这些函数使用的是过时值FUND_BITS而不是更新后的值.
我是否误解了F#如何创建不可变的值绑定?如果是这样,我无法找到以更新方式绑定的方法,例如:
let bf = &Library.Toolbox.FUND_BITS
Run Code Online (Sandbox Code Playgroud) 我怀疑我错过了一些非常明显的东西,但这不起作用:
let t = Array2D.create 1 1 1.0
for x in t do printfn "%f" x;;
Run Code Online (Sandbox Code Playgroud)
它失败了
错误FS0001:类型'obj'与float,float32,decimal等任何类型都不兼容,因为使用了printf样式的格式字符串
有趣的是使用printf "%A"或"%O"打印预期的值,这表明问题在于类型推断
一维数组的相应代码工作正常
let t = Array.create 1 1.0
for x in t do printfn "%f" x;;
Run Code Online (Sandbox Code Playgroud)
作为参考,这是在最新单声道上运行的2.0版(交互式和编译器)
我是F#的新手,我已经从我在网上找到的各种例子中明确了下面的代码,试图更好地理解我如何使用它.目前,下面的代码从文件中读取机器列表并ping每台机器.我不得不将初始数组从文件分成25个机器的较小数组,以控制并发操作的数量,否则需要很长时间才能映射出机器列表.我希望能够使用线程池来管理线程,但我还没有找到让它工作的方法.任何指导都会很棒.我无法做到这一点:
let creatework = FileLines|> Seq.map (fun elem -> ThreadPool.QueueUserWorkItem(new WaitCallback(dowork), elem))
Run Code Online (Sandbox Code Playgroud)
这是完整的代码:
open System.Threading
open System
open System.IO
let filePath = "c:\qa\machines.txt"
let FileLines = File.ReadAllLines(filePath)
let count = FileLines.Length/25
type ProcessResult = { exitCode : int; stdout : string; stderr : string }
let executeProcess (exe,cmdline) =
let psi = new System.Diagnostics.ProcessStartInfo(exe,cmdline)
psi.UseShellExecute <- false
psi.RedirectStandardOutput <- true
psi.RedirectStandardError <- true
psi.CreateNoWindow <- true
let p = System.Diagnostics.Process.Start(psi, EnableRaisingEvents = true)
let output = new System.Text.StringBuilder()
let error …Run Code Online (Sandbox Code Playgroud) 尝试使用Blocking Queue和此处给出的代码实现读写器问题.整个事情已编译并运行,但reader()和writer()函数中async {...}内的部分不会产生任何输出.我很确定它们被正确调用,因为即使我是F#的菜鸟,带有此代码的教程页面看起来也很真实.
这是整个代码:
open System
open System.IO
open System.Collections.Generic
//open System.Runtime.Serialization.Formatters.Binary
///defining Agent
type Agent<'T> = MailboxProcessor<'T>
///defining Message
type internal BlockingAgentMessage<'T> =
| Get of AsyncReplyChannel<'T>
| Add of 'T * AsyncReplyChannel<unit>
/// Agent-based implementation of producer/consumer problem
type BlockingQueueAgent<'T>(maxLength) =
let agent = Agent.Start(fun agent ->
let queue = new Queue<_>()
//let queue = new Queue()
// State machine running inside the agent
let rec emptyQueue() =
agent.Scan(fun msg ->
match msg with
| Add(value, …Run Code Online (Sandbox Code Playgroud) 是否有一些'日期解析器'库可以用于日期FParsec对字符串的作用?
也就是说,您要么指定规则,要么匹配它们以识别提供的模式.
相反,是否有任何库可以根据一些解析规则生成日期?这个想法是为用户提供"实时"完成,以指导他进行有效的未来fparsec匹配.
(生成解析的这个问题在僻静的解析圈中有一个名字吗?)
我正在努力实现这个目标:
7 2 3 5
10 12 20
res = 10 + max(7,2) ; 12 + max(2,3); 20 + max(3,5)
Run Code Online (Sandbox Code Playgroud)
到目前为止这是我的代码:
//prevline.count is always currLine.count+1
let getResLine currLine prevLine =
let rec loop resLine prevLine' = function
|[] -> resLine
|hd::tl -> loop (hd + (max (List.nth prevLine' 0) (List.nth prevLine' 1)))::resLine (List.tail prevLine') tl
loop [] prevLine currLine
Run Code Online (Sandbox Code Playgroud)
但它没有编译,它告诉我一些类型不匹配的错误,可能有更多经验的人可以看到我做的一些明显的错误,请帮助
编辑:根据建议更新我的代码,但它仍然无法正常工作
我试图在阵列中获得4个相邻数字的最大乘积,这就是我现在所得到的:
let max4 line =
let rec loop acc = function
|a :: b :: c :: [] -> acc
|a :: b :: c :: d :: tl -> loop (max(acc, a*b*c*d)) tl
|_ -> 0
loop 0 line
Run Code Online (Sandbox Code Playgroud)
我得到一个关于这max(,)句话的编译错误:
错误FS0001:类型不匹配.期待'a但给定'a*'b - >'a*'b当统一''a'和'a*'b - >'a*'b'时,结果类型将是无限的
有人知道这段代码有什么问题吗?(或其他解决方案)
我的程序有一个xml文件作为输入,我想只取一行的内容,不带xml标签.例如:
<string> xxx </string>
Run Code Online (Sandbox Code Playgroud)
我怎么才能得到"xxx"?
f# ×10
.net ×5
asynchronous ×2
convex ×1
fparsec ×1
interop ×1
optimization ×1
parsec ×1
threadpool ×1
xml ×1