我一直在尝试用变量创建我的解析器表达式,并将它们简化为二次表达式.
这是我的解析器语法:
Exercise : Expr '=' Expr
Expr : Term [+-] Expr | Term
Term : Factor [*/] Term | Factor
Factor: Atom [^] Factor | Atom
Atom: Number | Identified | [- sqrt] Atom | '(' Expr ')'
Run Code Online (Sandbox Code Playgroud)
对于解析我正在使用递归下降解析器.我想说我想解析一下:
"2 - 1 + 1 = 0"
结果为0,解析器创建错误的树:
-
/ \
2 +
/ \
1 1
Run Code Online (Sandbox Code Playgroud)
我怎样才能使这个语法保持联想?我是新手,请你告诉我哪里可以找到更多信息?我可以用递归下降解析器实现这一点吗?
grammar parsing recursive-descent associativity left-recursion
我正在处理如何反向创建日期范围的问题.我正在尝试这个:
import pandas as pd
dates = pd.date_range(end='2/08/2014', periods=104, freq='W-Sat', closed = None)
Run Code Online (Sandbox Code Playgroud)
我总是从以后到达更快,如下所示:
<class 'pandas.tseries.index.DatetimeIndex'>
[2012-02-18, ..., 2014-02-08]
Length: 104, Freq: W-SAT, Timezone: None
Run Code Online (Sandbox Code Playgroud)
我想从'2014-02-08'开始.
谢谢
解:
感谢您指出内置的反向功能,您需要返回并创建DatetimeIndex以在时间序列中使用它,如下所示:
dTmp = pd.date_range(end='2/08/2014', periods=104, freq='W-Sat', closed = None)
dates = [d for d in reversed(dTmp)]`
Run Code Online (Sandbox Code Playgroud) 我想这会很快回答,但我今天找不到合适的答案.我尝试创建F#SignalR自我主机应用程序(我按照本教程http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-signalr-20-self-主持人)
结果是我的应用程序没有在我的localhost上映射信号器/集线器,没有错误消息(只有当它没有找到客户端时才从JavaScript文件).
namespace Program
open Owin
open Dynamic
open Microsoft.AspNet.SignalR
open Microsoft.AspNet.SignalR.Hubs
open Microsoft.Owin.Hosting
open Microsoft.Owin.Cors
open System
open System.Diagnostics
type MyHub =
inherit Hub
member x.Send (name : string) (message : string) =
base.Clients.All?addMessage name message
type MyWebStartUp() =
member x.Configuration (app :IAppBuilder) =
app.UseCors CorsOptions.AllowAll |> ignore
app.MapSignalR() |> ignore
()
module Starter =
[<EntryPoint>]
let main argv =
let hostUrl = "http://localhost:8085"
let disposable = WebApp.Start<MyWebStartUp>(hostUrl)
Console.WriteLine("Server running on "+ hostUrl)
Console.ReadLine() |> ignore
disposable.Dispose() …Run Code Online (Sandbox Code Playgroud) 所以,假设我有一个CSV文件,其中包含包含Population和Profit列的标题,我想在F#interactive中使用它.我有以下代码:
#r "../packages/FSharp.Data.1.1.10/lib/net40/FSharp.Data.dll"
open FSharp.Data
// load csv header
let cities = new CsvProvider<"cities.csv">()
// how to reach data
let firstRow = cities.Data |> Seq.head
let firstPopulation = firstRow.Population
let firstProfit = firstRow.Profit
Run Code Online (Sandbox Code Playgroud)
我收到F#interactive的错误:
错误FS0039:未定义字段,构造函数或成员"Population"
这对我来说似乎很困惑,因为VS中的intellisense通过CSV类型提供程序从我的数据中获取此列没有任何问题.
此外,我尝试使用相同类型的提供程序创建一个程序,它一切正常.像这样:
open FSharp.Data
[<EntryPoint>]
let main argv =
use file = System.IO.File.CreateText("result.txt")
let csv = new CsvProvider<"cities.csv">()
for record in csv.Data do
fprintfn file "%A" record.Population
0
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?谢谢你的回答.
我是F#语言的新手,我的专业背景主要是C#/ SharePoint,最近我去了Haskell课程,这是一门可爱的功能语言.
我的问题是关于类型别名(同义词)和函数签名的使用,在Haskell中是这样做的好的和直接的方式:
type Person = (String,Int)
type Address = (Person, String,Int)
getPerson :: Address -> Person
getPerson n = first n ...
Run Code Online (Sandbox Code Playgroud)
当我在F#中尝试过同样的方法时,我有点失败:
type Person = (int,int)
type Address = (Person, String, Int)
let getPerson (n:Address) =
n.first ...
Run Code Online (Sandbox Code Playgroud)
我做错了什么?或者当我使用signature(int,int) - > String - > int - > String - >(int,int)函数时,提高可读性的最佳做法是什么?
下面的解决方案等同于上面提到的Haskell类型同义词:
type Person = int*int
type Address = Person * string * int
let first (n,_,_) = n
let getPerson (n:Address) : Person =
first n
Run Code Online (Sandbox Code Playgroud) 我相应地创建带有可选参数的控制器:
type ProductController(repository : IProductRepository) =
inherit Controller()
member this.List (?page1 : int) =
let page = defaultArg page1 1
Run Code Online (Sandbox Code Playgroud)
当我启动应用程序时,它给了我错误:“ System.MissingMethodException:没有为此对象定义无参数构造函数。 ”
我知道依赖注入的这个错误,这是我的 Ninject 设置:
static let RegisterServices(kernel: IKernel) =
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver <- new NinjectResolver(kernel)
let instance = Mock<IProductRepository>()
.Setup(fun m -> <@ m.Products @>)
.Returns([
new Product(1, "Football", "", 25M, "");
new Product(2, "Surf board", "", 179M, "");
new Product(3, "Running shoes", "", 95M, "")
]).Create()
kernel.Bind<IProductRepository>().ToConstant(instance) |> ignore
do()
Run Code Online (Sandbox Code Playgroud)
问题是当我从控制器中删除我的可选参数时一切正常。当更改常规参数时,它给我以下错误: 参数字典包含一个空条目,用于方法 'System.Web.Mvc.ViewResult List(Int32)' 的不可为空类型 'System.Int32' 的参数 'page' 'FSharpStore.WebUI.ProductController'。可选参数必须是引用类型、可为空类型或声明为可选参数。参数名称:参数 …
我有DETS文件的问题,我找不到如何从我的驱动器中删除DETS文件的功能.让我们演示场景,您创建DETS文件插入一个元素然后您想要将该文件作为临时但持久的存储区销毁.
dets:open_file("TestFile",[{file, "TestFile.db"}]).
{ok,"TestFile"}
dets:insert("TestFile", {a,b,c}).
ok
dets:delete_all_objects("TestFile").
ok
dets:info("TestFile").
[{type,set},
{keypos,1},
{size,0},
{file_size,5432},
{filename,"TestFile.db"}]
Run Code Online (Sandbox Code Playgroud)
如何删除文件"TestFile.db"?
我有遗留代码,其中是私有枚举,我需要构建另一种类型进行验收测试,但我被卡住,因为这个枚举是私有的,它不属于任何类,如下所示:
enum Element {
ELEMENT1, ELEMENT2;
public static Element[] values() { /* compiled code */ }
public static Element valueOf(java.lang.String name) { /* compiled code */ }
private Element() { /* compiled code */ }
}
Run Code Online (Sandbox Code Playgroud)
有没有办法如何使用这个枚举,从遗留代码中暴露它,或者可能如何模拟它?
更新:我知道我可以通过反射读取值枚举,但我有另一个公共的类,我需要在其构造函数中使用枚举值,这个类与Element在同一个包中,它的构造函数是:
public class ElementProvider {
public ElementProvider(string name, Element element){ /*compiled code*/ }
}
Run Code Online (Sandbox Code Playgroud)