【问题标题】:FSharp define type in terms of predicateFSharp 根据谓词定义类型
【发布时间】:2014-04-25 22:34:16
【问题描述】:

我的代码看起来像

type U0 = E1|E2|E3...
type T2 = {field1: string; field2: string; field3: string}
type T1 = T2*T2*T2
type T0 = T1*T1*T1

我想在field1 的类型上强制执行一些谓词P1field1(GetUnionCases typeof<U0>).contains(field1)。我希望这不是太抽象。

为此,我想介绍 P1 类型,其定义类似于

type P1(x) = (GetUnionCases typeof<U0>).map(fun x -> x.Name).contains(x)

【问题讨论】:

  • 您可以考虑使用与命名构造函数结合的保护级别,就像在this answer 中一样。

标签: types f#


【解决方案1】:

一般来说,F# 没有任何形式的 refinement types 可以让您将任意谓词作为约束附加到类型声明。

很难根据您有点抽象的示例给出更具体的答案,但通常可以以不同的方式设计域(您的类型),以便通过构造强制执行谓词 - 换句话说,设计您的类型,以便该类型的任何值自动满足谓词。 designing with types article series 有一些实际的例子表明了这一点。

我没有完全按照你的例子,但是说你想确保field1的字符串包含值E1,字符串field2包含值E2(作为子字符串)等等。所以:

{  field1 = "hi E1 there" } // valid
{  field1 = "hi there" } // invalid

您可以将field1 的类型从string 更改为string * string,表示字符串“E1”的前缀和后缀,因此您只能构造:

{ field1 = "hi", "there" } // valid

现在无法创建不隐含“E1”作为子字符串的值!
我很确定我误解了你的例子,但我希望这能证明这个想法......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2015-05-22
    • 2020-01-27
    • 2020-03-31
    相关资源
    最近更新 更多