给出一个简单的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#中的动态对象的另一种方法.我正在使用它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.我尝试过使用引文,但不能正确拼接,也许这不是正确的方法.
我刚刚开始使用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但一直无法找到任何类型的参考.它似乎不是一种记录类型.它几乎看起来像一个普通的旧功能.那是什么?
感谢任何帮助女孩和家伙.
我已经将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) 我正在创建一个带有多个受歧视联盟(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#中解决这类问题
当我在函数定义中设置括号时,函数类型会发生变化.
我有两个函数: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#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中不出现下点(只有一个条目:)JsonExtensionsFSharp.Data.Unit Systems
如何使该模块中的代码可用,以便我可以运行书中的代码?
我有几个 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 个号码。
我有一个列表,并希望单独返回每个元素.基本上就像从堆栈中弹出一样.例如:
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) 我似乎无法克服这一挑战,这让我疯狂.我以为我正确地遵循了说明.有人可以弄清楚错误是什么吗?(我觉得这很简单.)
挑战在于:https://www.freecodecamp.com/challenges/escape-sequences-in-strings,下面是我的代码.
var myStr =
FirstLine\n
\\SecondLine\\
\rThirdLine;
Run Code Online (Sandbox Code Playgroud)
提前致谢!
编辑:第一行错误:意外'\'和缺少分号; 第二行错误:意外'\'; 第3行错误:意外'\'