小编abh*_*hek的帖子

F#如何在递归区分联合中指定类型限制

我试图将我的语法定义为一个有区别的联盟.它有两种可能:intdatetime和mathemetical运营商AddMul. Add适用于intdatetime(如加在INT天) Mul只在工作int,而不是datetime 语法可以递归

我的语法看起来像

type MyExpression =
|Integer of int
|Date of datetime
|Add of MyExpression * MyExpression
|Mul of MyExpression * MyExpression
Run Code Online (Sandbox Code Playgroud)

我编写了一个解析器(fparsec),它可以解析我的语法中的文本,但我不知道如何处理Mul可递归的条件,但仅限于Integer.

是否可以选择在我的MyExpression类型上定义此限制,还是必须在我的解析输入中处理此问题?

f# restriction f#-3.0

10
推荐指数
2
解决办法
172
查看次数

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
查看次数

FParsec特殊字符串之间的字符串列表

在尝试解析时{asdc,456,ghji,abc},我跑了

run specialListParser "{asdc,456,ghji,abc}"
Run Code Online (Sandbox Code Playgroud)

解析器失败了

错误发生在输入流的末尾.
期待:任何不在',',','或'}'中的字符

我根据这个答案定义了我的解析器:

let str : Parser<_> = many1Chars (noneOf ",")
let comma = pstring ","
let listParser = sepBy str comma

let specialListParser = between (pstring "{") (pstring "}") listParser
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

f# fparsec

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

标签 统计

f# ×3

f#-3.0 ×1

fparsec ×1

restriction ×1