标签: f#

使用默认的int*int类型除法键入Constraint Mismatch

所以我正在研究一些示例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)

.net f#

0
推荐指数
1
解决办法
298
查看次数

什么是凸优化的dotnet库?

你会推荐任何凸优化库吗?

理想的开源.半定规划和QCQP的先验.

(我打算用fsharp和任何dotnet一起使用它)

.net optimization f# convex-optimization convex

0
推荐指数
1
解决办法
454
查看次数

在f#中,绑定到ac#library中的值

我有一个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)

f# interop

0
推荐指数
1
解决办法
124
查看次数

对于2D数组中的循环,在F#中给出不正确的类型

我怀疑我错过了一些非常明显的东西,但这不起作用:

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# type-inference

0
推荐指数
1
解决办法
600
查看次数

F# - 需要帮助将其转换为使用线程池

我是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)

f# asynchronous threadpool

0
推荐指数
1
解决办法
473
查看次数

使用F#在异步函数中没有输出?

尝试使用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)

.net f# asynchronous

0
推荐指数
1
解决办法
208
查看次数

使用F#解析日期

是否有一些'日期解析器'库可以用于日期FParsec对字符串的作用?

也就是说,您要么指定规则,要么匹配它们以识别提供的模式.


相反,是否有任何库可以根据一些解析规则生成日期?这个想法是为用户提供"实时"完成,以指导他进行有效的未来fparsec匹配.

(生成解析的这个问题在僻静的解析圈中有一个名字吗?)

f# parsec fparsec

0
推荐指数
1
解决办法
270
查看次数

sum 2列表并在f#中获得第3名,请更正我的语法

我正在努力实现这个目标:

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)

但它没有编译,它告诉我一些类型不匹配的错误,可能有更多经验的人可以看到我做的一些明显的错误,请帮助

编辑:根据建议更新我的代码,但它仍然无法正常工作

.net f#

0
推荐指数
1
解决办法
263
查看次数

f#获取数组中4个相邻数字的乘积

我试图在阵列中获得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'时,结果类型将是无限的


有人知道这段代码有什么问题吗?(或其他解决方案)

.net f#

0
推荐指数
1
解决办法
224
查看次数

从XML文件中获取没有标记的行的内容

我的程序有一个xml文件作为输入,我想只取一行的内容,不带xml标签.例如:

<string> xxx </string>
Run Code Online (Sandbox Code Playgroud)

我怎么才能得到"xxx"?

xml f#

0
推荐指数
1
解决办法
125
查看次数