标签: dhall

可以在 Dhall 中编码有效图形的类型吗?

我想在 Dhall 中表示一个 wiki(一组包含有向图的文档)。这些文档将呈现为 HTML,我想防止生成断开的链接。在我看来,这可以通过使无效图(带有指向不存在节点的链接的图)无法通过类型系统表示或编写一个函数来返回任何可能图中的错误列表(例如“在可能的图中X,节点 A 包含指向不存在的节点 B 的链接”)。

一个简单的邻接列表表示可能看起来像这样:

let Node : Type = {
    id: Text,
    neighbors: List Text
}
let Graph : Type = List Node
let example : Graph = [
    { id = "a", neighbors = ["b"] }
]
in example
Run Code Online (Sandbox Code Playgroud)

正如这个例子所表明的那样,这种类型接受与有效图不对应的值(没有 id 为“b”的节点,但 id 为“a”的节点规定了一个 id 为“b”的邻居)。此外,不可能通过折叠每个节点的邻居来生成这些问题的列表,因为 Dhall 设计上不支持字符串比较。

是否有任何表示可以允许计算断开的链接列表或通过类型系统排除断开的链接?

更新:我刚刚发现 Naturals 在 Dhall 中具有可比性。所以我想可以编写一个函数来识别任何无效的边缘(“断开的链接”),如果标识符是自然的,则重复使用标识符。

但是,是否可以定义 Graph 类型的原始问题仍然存在。

graph adjacency-list dhall

11
推荐指数
1
解决办法
1108
查看次数

我如何代表dhall中的元组?

我想在dhall中表示IPv4地址,因此我可以管理我的主机配置.

默认情况下,它保持为Text; 但这显然不能令人满意,因为它允许任何旧文本漏掉.我想将这些值保持为8位值的4元组.

我不认为Dhall本身可以允许这种情况 - 我能看到的最接近的是{a:Natural,b:Natural}等的记录,但这在语法上是笨重的,并且仍然允许在0-255之外的八位字节值.

假设我无法直接在Dhall中实现这一点,也许我可以在Haskell中定义一个类型,它可以自动从Dhall中读取4个长度的Naturals列表,

我的问题是:

  1. 我是否认为直接在Dhall中这样做是不可能或不成比例的?
  2. 要在Haskell中定义此类型,我是否要定义一个实例Interpret; 如果是这样,我如何定义一个将在4部分的整数列表中读取的实例,同时为错误构造的错误长度列表(错误长度的列表,非整数列表或非列表)或out -of-bounds值(不在0和255之间的整数).

这就是我尝试过的:

{-# LANGUAGE DeriveGeneric   #-}
{-# LANGUAGE RecordWildCards #-}

import Control.Applicative  ( empty, pure )
import Dhall  ( Generic, Interpret( autoWith ), Type( Type, extract, expected ) )
import Dhall.Core  ( Expr( Natural, NaturalLit ) )
import Data.Word  ( Word8 )

newtype IP = IP (Word8, Word8, Word8, Word8)
  deriving Generic

word8 :: Type Word8
word8 = Type {..}
  where
    extract (NaturalLit n) | n >= …
Run Code Online (Sandbox Code Playgroud)

haskell dhall

10
推荐指数
1
解决办法
238
查看次数

有没有一种方法可以从haskell数据类型生成dhall模式?

我正在尝试使用dhall重写Haksell应用程序中使用的BIG Yaml配置文件。为此,我使用的json-to-dhall是需要SCHEMA的类型,即重排表达式的类型。问题是实际架构几乎不可能手动编写,因为它涉及很多求和类型(和嵌套求和类型)。我尝试通过将yaml的某些部分手动转换为dhall并运行来生成模式dhall type。这给出了我可以使用的架构jston-to-dhall后来。这适用于简单类型,但是现在我面临着(工会)工会的问题。Dhall需要类型注释来写入我用来生成类型的文件...所以我想知道是否有一种方法(使用工具或修改我的haskell应用程序)将Haskell数据转储到正确的dhall文件或至少从Haskell类型生成模式。

haskell dhall

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

`dhall format` 和 `dhall lint` 之间的区别

dhall第一次玩的时候看到它支持这两个选项:

  ./dhall --help
  ...
  lint                     Improve Dhall code
  format                   Formatter for the Dhall language
Run Code Online (Sandbox Code Playgroud)

两者有什么区别?从在我的示例项目上运行它们来看,它们看起来是一样的。我原以为 linter 在某些方面比格式化更进一步(例如推荐“惯用的”dhall),但找不到任何关于它的信息。

dhall

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

如何创建具有任意键但键入值的 dhall 模式?

在 dhall 中,如何为以下 yaml 创建模式?

environment:
    local:
        path: "/path/to/env"
        envvars:
            - var1
            - var2
    stage:
        path: "/path/to/env"
        envvars:
            - var1
            - var2
    prod:
        path: "/path/to/env"
        envvars:
            - var1
            - var2
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它具有任意键(“local”、“stage”等),但值的类型相同。我相信这是一个相当常见的用例,但我没有在教程中看到它的讨论。

dhall

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

如何在Dhall中定义和使用类似Haskell的求和类型

如何在Dhall编程语言中定义类似于Haskell的求和类型的求和类型?

例如,如果我在Haskell中定义

data SumProp = Option1 | Option2
Run Code Online (Sandbox Code Playgroud)

我的目的是在Dhall中定义一条记录,在该记录中其属性之一具有一组有限的可能值:

\(sumPropValue : SumProp) -> { value = sumPropValue }
Run Code Online (Sandbox Code Playgroud)

haskell dhall

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

在 dhall 中拆分字符串

我正在玩 dhall,想知道如何实现表单的字符串拆分功能

?(text: Text) -> ?(delimiter: Text) -> List Text

但是,似乎 dhall没有表示单个字符的概念/类型。而 Prelude 中没有这样的功能。

您可以对 Text 值做的唯一事情是将它们连接起来

所以……有可能吗?

dhall

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

标签 统计

dhall ×7

haskell ×3

adjacency-list ×1

graph ×1