小编s95*_*163的帖子

如何从VS Code启动F#控制台应用程序

给出一个简单的F#控制台应用:

[<EntryPoint>]
let main argv =
    printfn "Hello  world"
    Console.ReadLine() |>  ignore
    0
Run Code Online (Sandbox Code Playgroud)

我需要做什么才能以与ctrl F5在Visual Studio中相同的方式启动控制台应用程序.我尝试使用Fake.ProcessHelper从FAKE构建脚本运行它:

Target "Run" (fun _ ->     

        let exe = @"C:\Source\code\fs_console_app\build\fs_console_app.exe"
        let errorCode = Shell.AsyncExec(exe, "", buildDir)
        ()    
    )
Run Code Online (Sandbox Code Playgroud)

点击Ctrl F5我收到以下构建报告:

Target     Duration
------     --------
Build      00:00:00.3916039
Run        00:00:00.0743197
Total:     00:00:00.5605493
Status:    Ok
Run Code Online (Sandbox Code Playgroud)

但没有控制台应用程序启动和等待输入的迹象.

f# f#-fake visual-studio-code ionide

6
推荐指数
1
解决办法
1095
查看次数

参数LINQ查询

这是访问F#中的动态对象的另一种方法.我正在使用它let y = x.Where(fun x -> x.City ="London").Select("new(City,Zip)")来参数化查询并提取必要的项目.这些对应于SQL查询中的列,并由datacontext的属性表示.这是我想作为参数传递的部分.

type Northwind = ODataService<"http://services.odata.org/Northwind/Northwind.svc">
let db = Northwind.GetDataContext()
let query2 = query { for customer in db.Customers do
                     select customer}  |> Seq.toArray
let qryfun (x:Northwind.ServiceTypes.Customer) =
    query { for x in query2 do
            select (x.City,x.CompanyName,x.Country)}
Run Code Online (Sandbox Code Playgroud)

基本上我不仅要传递,x而且还要传递x.*.当我访问一个已修复的数据库时,我可以将x分解出来.但是我现在有40个小函数提取不同的列.是否有可能将其分解为一个函数并将该属性作为参数传递?所以有时我会提取x.City但其他时间x.Country.我尝试过使用引文,但不能正确拼接,也许这不是正确的方法.

linq f# quotations

5
推荐指数
1
解决办法
220
查看次数

这是什么类型的?

我刚刚开始使用Tamizhvendan S的书F#Applied,并遇到了这段代码:

type WebPart = Context -> Async<Context option>
Run Code Online (Sandbox Code Playgroud)

我一直在浏览微软的F#文档以及我最喜欢的F#网站,Scott Wlaschin,F# for Fun and Profit但一直无法找到任何类型的参考.它似乎不是一种记录类型.它几乎看起来像一个普通的旧功能.那是什么?

感谢任何帮助女孩和家伙.

f# suave

5
推荐指数
1
解决办法
174
查看次数

Paket框架限制差异

我已经将Argu添加到我的项目中,并且随之下载了大约700MB的包.这与Paket安装额外的软件包有关,但是我想要解决使用> =或者只是框架:net46来规定框架限制的细微差别.

在我第一次尝试时,我刚刚将Argu添加到paket.dependencies文件中:

nuget Argu

因为这导致了几乎一GB的软件包下载,我问:

.\.paket\paket.exe why nuget System.Threading.Thread

而paket回答说:

Paket version 3.27.02  
NuGet System.Threading.Thread is a transitive dependency.  
It's a part of following dependency chains:  

-> Argu
  -> FSharp.Core
    -> System.Threading.Thread

-> MathNet.Numerics.FSharp
  -> FSharp.Core
    -> System.Threading.Thread

0 seconds - ready.  
Run Code Online (Sandbox Code Playgroud)

然后我向paket.dependencies添加了以下限制:

nuget Argu framework: >= net46

然而,这导致下载相同的包.

最后我做了:

nuget Argu framework: net46

而这个特定的限制确实删除了所有不必要的包:

Garbage collecting Microsoft.NETCore.Platforms
Garbage collecting Microsoft.Win32.Primitives
Garbage collecting NETStandard.Library
Garbage collecting System.AppContext
Garbage collecting System.Collections.Concurrent
...
Run Code Online (Sandbox Code Playgroud)

但是我的所有其他依赖项都是这样指定的(主要是因为,但并不总是,因为我正在解决原始问题):

source …
Run Code Online (Sandbox Code Playgroud)

f# paket

5
推荐指数
1
解决办法
286
查看次数

f#获取可能的歧视联合项目列表

我正在创建一个带有多个受歧视联盟(DU)的简单DSL.有积木DU和较高的DU建立在较低的顶部之上.

现在我想创建UI,用户可以在其中构建与我的DSL匹配的文本.到UI我不想表达我的完整语法,但只显示可以执行的操作.所以我需要一种方法来从我的层次结构DU中找出用户可以做的其他可能状态.

示例输入文本 (1 + (2 * 3))

type Expression =
   | Constant of int
   | Add of Expression * Expression
   | Mul of expression * Expression
Run Code Online (Sandbox Code Playgroud)

所以当用户启动时,我必须返回一个只能Constant使用的列表.当用户将(常量)作为当前状态传递时,我必须告诉你可以add/Mul(这是表达式)等等.

我想用一种类型安全的方式表示一种结构,它表示当前状态和可能的状态.有没有办法在f#中解决这类问题

f#

5
推荐指数
1
解决办法
366
查看次数

括号更改功能签名

当我在函数定义中设置括号时,函数类型会发生变化.

我有两个函数:addition1(不带括号)和addition2(带括号).类型相同,但功能签名不同.为什么类型不同?

let addition1 a b =
  a + b
//val addition1 : a:int -> b:int -> int

let addition2(a, b) = 
  a + b
//val addition2 : a:int * b:int -> int
Run Code Online (Sandbox Code Playgroud)

f#

5
推荐指数
1
解决办法
142
查看次数

如何访问FSharp.Data.JsonExtensions?

抱歉,这个问题还不清楚。我对F#4.0中的软件包感到困惑,这是我能做的最好的事情。

该书Expert F# 4.0由Don赛姆,亚当Granicz和安东尼奥奇斯泰尼诺包含的代码用于处理JSON数据。代码以

open FSharp.Data
open FSharp.Data.JsonExtensions
Run Code Online (Sandbox Code Playgroud)

我已经FSharp.Data在Visual Studio中安装了。不过,“ JsonExtensions”一词在其下仍显示红色花键,其余代码无法编译。

Add References在Solution Explorer中我没有找到一个包FSharp.Data.JsonExtensions。我也看了下NuGet,没有发现包裹FSharp.Data.JsonExtensions。有文档 表明它是一个模块。但是,使用Visual Studio中不出现下点(只有一个条目:)JsonExtensions
FSharp.Data.Unit Systems

如何使该模块中的代码可用,以便我可以运行书中的代码?

f# f#-data

5
推荐指数
1
解决办法
258
查看次数

如何从多个 goroutine 共享的单个通道中读取数据

我有几个 goroutine 写入同一个通道。如果我使用缓冲通道,我可以检索输入。但是,如果使用无缓冲通道,我只能读取大约一半的值:

func testAsyncFunc2() {

    ch := make(chan int,10)

    fmt.Println("testAsyncFunc2")
    wg.Add(10)
    for  i :=0; i < 10; i++  {
        go sender3(ch, i)
        wg.Done()
    }

    receiver3(ch)

    close(ch)
    wg.Wait()
}
Run Code Online (Sandbox Code Playgroud)

这是接收器函数:

func receiver3(ch chan int) {
    for {
        select {
        case <-ch:
            fmt.Println(<-ch)
        default:
            fmt.Println("Done...")
            return
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

发送功能:

func sender3(ch chan int, i int) {
    ch <- i
}
Run Code Online (Sandbox Code Playgroud)

和输出:

testAsyncFunc 2 0 4 6 8 2 完成...

虽然我希望能拿回 10 个号码。

go

5
推荐指数
1
解决办法
3130
查看次数

递归地将列表解压缩为元素

我有一个列表,并希望单独返回每个元素.基本上就像从堆栈中弹出一样.例如:

let rnd = new System.Random()
let rnds = List.init 10 (fun _ -> rnd.Next(100))
List.iter (fun x -> printfn "%A"x ) rnds
Run Code Online (Sandbox Code Playgroud)

但是,我实际上想要一个接一个地返回每个整数,直到列表为空,而不是迭代.所以基本上是这样的:

List.head(rnds)
List.head(List.tail(rnds))
List.head(List.tail(List.tail(rnds)))
List.head(List.tail(List.tail(List.tail(List.tail(rnds)))))
Run Code Online (Sandbox Code Playgroud)

不幸的是,我尝试使用折叠或扫描的递归解决方案甚至更好的尝试都没有成功.例如,这只返回列表(与map相同).

let pop3 (rnds:int list) =
    let rec pop3' rnds acc =
        match rnds with
        | head :: tail -> List.tail(tail)
        | [] -> acc
    pop3' [] rnds
Run Code Online (Sandbox Code Playgroud)

recursion f# mutable

4
推荐指数
1
解决办法
123
查看次数

我的代码在FreeCodeCamp的"Escape Sequences in Strings"挑战中有什么问题?

我似乎无法克服这一挑战,这让我疯狂.我以为我正确地遵循了说明.有人可以弄清楚错误是什么吗?(我觉得这很简单.)

挑战在于:https://www.freecodecamp.com/challenges/escape-sequences-in-strings,下面是我的代码.

var myStr =
FirstLine\n
\\SecondLine\\
\rThirdLine;
Run Code Online (Sandbox Code Playgroud)

提前致谢!

编辑:第一行错误:意外'\'和缺少分号; 第二行错误:意外'\'; 第3行错误:意外'\'

javascript escaping

3
推荐指数
1
解决办法
1万
查看次数