标签: gadt

GADT 上的模式匹配失败

我在 ReasonML 上玩了更多,发现type t以下示例中的模式匹配无法处理错误

错误:此模式匹配 t(float) 类型的值,但预期模式匹配 t(int) 类型的值 类型 float 与类型 int 不兼容

  type t('a) =
    | One: t(int)
    | Two: t(float);

  let x =
    fun
    | One => None
    | Two => None;
Run Code Online (Sandbox Code Playgroud)

现在在某种程度上,如果这是关于函数的返回类型,这对我来说是有意义的。

我找到了一个等价问题的答案(我认为)。对于第二部分,答案似乎是忽略构造函数的绑定类型。在 ReasonML 中是否可能相同?

Ps:请在术语上迂腐地纠正我,我还在学习什么是什么。

Pps:我知道我可以通过显式键入来解决原始问题,x但我真的很喜欢fun它的语法,因为它很有趣。

ocaml pattern-matching gadt reason

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

GADT 的类似 newtype 的操作语义,其中类型完全确定构造函数

假设我有一个如下所示的 GADT:

data Tag = A | B | C

data Payload (tag :: Tag) where
  PA :: Int -> Payload A
  PB :: Double -> Payload B
  PC :: Bool -> Payload C
Run Code Online (Sandbox Code Playgroud)

我想要Payload自己没有运行时表示——即我想要Coercible Int (Payload A),我想要零成本模式匹配,并且通常我希望它表现得好像我有以下三个 newtype 定义:

newtype PayloadA = PA Int
newtype PayloadB = PB Double
newtype PayloadC = PC Bool
Run Code Online (Sandbox Code Playgroud)

有没有办法说服 GHC 给我那个?

haskell coercion gadt newtype

1
推荐指数
2
解决办法
116
查看次数

Scala 3 中枚举的不变默认类型

Scala 3 现在有一种改进的方式来定义 ADT。一种语法糖,消除了用通常的方式做这些事情的所有麻烦sealed trait

所以我会用一个例子来解释我的问题

enum Adt[+A]{
    case Option1
    case Option2
}
Run Code Online (Sandbox Code Playgroud)

在本例中Option1Option2的类型为Adt[Nothing],因为类型参数A是协变的。

如果枚举是逆变的,那么它们的类型就是Adt[Any]

但如果它是不变的呢?

enums scala dotty gadt scala-3

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

GADT 的非穷举模式

我想编写一个函数,用 GADT 样式定义的数据结构将正则 lambda 表达式转换为 DeBrujin 样式。

{-# Language GADTs, StandaloneDeriving,ScopedTypeVariables #-}

module DeBrujin where

import Debug.Trace
import Data.List as L

data Apply
data Abstract
data Variable

data LambdaTerm a where
  Var :: String -> LambdaTerm Variable
  Abs :: String -> LambdaTerm a -> LambdaTerm Abstract
  App :: LambdaTerm Abstract -> LambdaTerm a -> LambdaTerm Apply

instance Show (LambdaTerm a) where
  show (Var v) = v
  show (Abs s t) = "?" ++ s ++ "." ++ show t
  show …
Run Code Online (Sandbox Code Playgroud)

haskell ghc gadt

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

像 `Type.eq` / `Typing_equal.equal` 这样的相等见证有什么用?

type (_, _) eq = Equal: ('a, 'a) eq来源)有什么用?我已经refl在 Coq 中使用过,但还不需要像 OCaml 中那样的东西。

该类型已在即将发布的 OCaml Stdlib 版本中定义Base,并且.

我如何知道何时使用此类型,以及使用此类型的代码是什么样的?

基地文档说:

Type_equal 的目的是表示类型检查器不知道的类型相等性,否则可能是因为类型相等性取决于动态数据,或者可能是因为类型系统不够强大。

所以听起来我正在寻找类型相等性依赖于动态数据或类型系统不够强大的示例,而类型equal是有帮助的。

我发现使用了equal具有相同定义的类型Stdlib.camlinternalFormat但不理解它

更新上面的基本文档中的引用可能不是具体eq的,并且可能与Base.Type_equal.Idiuc 更相关。

ocaml equality gadt dependent-type

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

如何从Haskell中的(G)ADT参数获取构造函数作为函数?

如何从Haskell中的(G)ADT参数获取构造函数作为函数?可以这样做吗?

data  Ex1 =  C1 Int | C2 Int -- | ..... 
           | C3

fun :: Ex1 -> Ex1
fun C3    = C3
fun (c i) = c $ i^2
Run Code Online (Sandbox Code Playgroud)

这对我来说不合适.

fun (C1 i) = C1 $ i^2
fun (C2 i) = C2 $ i^2
Run Code Online (Sandbox Code Playgroud)

haskell gadt

0
推荐指数
1
解决办法
76
查看次数