如何解构 SNat(单例)

2023-11-23

我正在 Haskell 中试验依赖类型,并在paper“单身人士”包的:

replicate2 :: forall n a. SingI n => a -> Vec a n
replicate2 a = case (sing :: Sing n) of
  SZero -> VNil
  SSucc _ -> VCons a (replicate2 a)

所以我尝试自己实现这个,只是为了感受一下它是如何工作的:

{-# LANGUAGE DataKinds           #-}
{-# LANGUAGE GADTs               #-}
{-# LANGUAGE KindSignatures      #-}
{-# LANGUAGE TypeOperators       #-}
{-# LANGUAGE RankNTypes          #-}
{-# LANGUAGE ScopedTypeVariables #-}

import           Data.Singletons
import           Data.Singletons.Prelude
import           Data.Singletons.TypeLits

data V :: Nat -> * -> * where
  Nil  :: V 0 a
  (:>) :: a -> V n a -> V (n :+ 1) a

infixr 5 :>

replicateV :: SingI n => a -> V n a
replicateV = replicateV' sing
  where replicateV' :: Sing n -> a -> V n a
        replicateV' sn a = case sn of
            SNat -> undefined -- what can I do with this?

现在的问题是Sing实例为Nat不具有SZero or SSucc。只有一个构造函数称为SNat.

> :info Sing
data instance Sing n where
  SNat :: KnownNat n => Sing n

这与其他允许匹配的单例不同,例如STrue and SFalse,例如下面的(无用的)示例:

data Foo :: Bool -> * -> * where
  T :: a -> Foo True a
  F :: a -> Foo False a

foo :: forall a b. SingI b => a -> Foo b a
foo a = case (sing :: Sing b) of
  STrue -> T a
  SFalse -> F a

您可以使用fromSing获取基本类型,但这当然允许 GHC 检查输出向量的类型:

-- does not typecheck
replicateV2 :: SingI n => a -> V n a
replicateV2 = replicateV' sing
  where replicateV' :: Sing n -> a -> V n a
        replicateV' sn a = case fromSing sn of
              0 -> Nil
              n -> a :> replicateV2 a

所以我的问题是:如何实施replicateV?

EDIT

erisco 给出的答案解释了为什么我解构一个SNat不起作用。但即使有type-natural图书馆,我无法实施replicateV为了V数据类型使用GHC的内置Nat types.

例如下面的代码可以编译:

replicateV :: SingI n => a -> V n a
replicateV = replicateV' sing
  where replicateV' :: Sing n -> a -> V n a
        replicateV' sn a = case TN.sToPeano sn of
            TN.SZ       -> undefined
            (TN.SS sn') -> undefined

但这似乎没有为编译器提供足够的信息来推断是否n is 0或不。例如,以下给出了编译器错误:

replicateV :: SingI n => a -> V n a
replicateV = replicateV' sing
  where replicateV' :: Sing n -> a -> V n a
        replicateV' sn a = case TN.sToPeano sn of
            TN.SZ       -> Nil
            (TN.SS sn') -> undefined

这会产生以下错误:

src/Vec.hs:25:28: error:
    • Could not deduce: n1 ~ 0
      from the context: TN.ToPeano n1 ~ 'TN.Z
        bound by a pattern with constructor:
                   TN.SZ :: forall (z0 :: TN.Nat). z0 ~ 'TN.Z => Sing z0,
                 in a case alternative
        at src/Vec.hs:25:13-17
      ‘n1’ is a rigid type variable bound by
        the type signature for:
          replicateV' :: forall (n1 :: Nat) a1. Sing n1 -> a1 -> V n1 a1
        at src/Vec.hs:23:24
      Expected type: V n1 a1
        Actual type: V 0 a1
    • In the expression: Nil
      In a case alternative: TN.SZ -> Nil
      In the expression:
        case TN.sToPeano sn of {
          TN.SZ -> Nil
          (TN.SS sn') -> undefined }
    • Relevant bindings include
        sn :: Sing n1 (bound at src/Vec.hs:24:21)
        replicateV' :: Sing n1 -> a1 -> V n1 a1 (bound at src/Vec.hs:24:9)

所以,我原来的问题仍然存在,我仍然无法做任何有用的事情SNat.


这里有两个自然概念在起作用。一种是“字面自然数”(即 0、1、2 等),另一种是“皮亚诺自然数”(即 Z、S Z、S (S Z) 等)。这篇论文使用的显然是皮亚诺自然色,但单身人士使用的却是字面上的自然色。

值得庆幸的是,还有另一个包叫自然类型它定义了皮亚诺自然物以及转换为字面自然数 and 从字面自然数转换.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解构 SNat(单例) 的相关文章

  • 指定 ghci 中“加载”操作的搜索路径

    In 加载源文件 http www haskell org ghc docs 7 6 1 html users guide loading source files html它指出查找源文件的搜索路径是使用 i 选项指定的 ghci idi
  • 何时使用 STRef 或 IORef?

    STRef 和 IORef 之间到底有什么区别 何时使用它们 据我所知 它们都是可变状态 那么它们存在的意义是什么 您可以在其中做更多事情IO单子比ST单子 后者提供可变引用 前者提供可变引用 异常捕获 线程 当然还有IO 使用可以解决问题
  • 你在实际项目中使用过Quickcheck吗[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 快速检查 http www cs chalmers se rjmh QuickCheck 及其变体 即使有一个Java https bitbuc
  • Meyers 的单例实现实际上是如何实现单例的

    我读了很多关于单例的内容 什么时候应该使用它们 什么时候不应该使用它们 以及如何安全地实现它们 我正在用 C 11 编写 并且遇到了 Meyer 的单例延迟初始化实现 如所示这个问题 https stackoverflow com ques
  • Foldl 是否比其严格的表亲 Foldl' 更好?

    Haskell 有两个列表左折叠函数 foldl 以及 严格 版本 foldl 不严格的问题foldl是它建造了一座重击塔 foldl 0 1 5 gt 0 1 2 3 4 5 gt 15 这会浪费内存 并且如果列表中的项太多 可能会导致堆
  • 在 Haskell/Yampa 和 HOOD 中调试游戏对象的输出

    我一直坚持使用 Haskell Yampa Arrows with HOOD 为我的游戏对象生成调试输出 我的引擎基本上运行一系列游戏对象 这些对象产生输出状态 线 圆 然后进行渲染 data Output Circle Position2
  • XMonad 在不同工作区启动

    我想在 xmonad start 上启动不同工作区中的一些应用程序 这很重要 所以 我写了以下内容startupHook startupApps String startupApps konsole emacs firefox gvim k
  • 如何在 Windows 7 中配置 cabal?

    我已经在Windows 7中安装了Haskell Platform 2012 我在控制台中编写cabal update我收到消息说有新版本的阴谋集团 我写的cabal install cabal install 安装完成后 它告诉我 cab
  • 我需要什么类型签名才能将函数列表转换为 Haskell 代码? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 haskell 中不允许这样的函数定义 https stackoverflow com questions 6168880 why is such a function definition
  • Android 中 Activity 之间的对象共享

    您好 我有一个关于在整个应用程序中传递对象的问题 假设我想在整个应用程序中拥有一个大的自定义对象 该对象将被多个活动和服务使用 我一开始做的就是这样的 首先 我创建了一个 Application 类并定义了一个单例对象 public cla
  • Windows Azure - 无单点故障的领导者实例

    我正在寻找一种在多个辅助角色实例上拥有 单例 模块的方法 我希望在 Azure 中拥有一个带有队列和多个辅助角色的并行执行模型 这个想法是希望有一个 主 实例 也就是说检查新数据 并通过将其添加到队列来调度它 处理来自特殊队列的所有消息 该
  • 是否可以列出派生 Generic 的记录数据类型中字段的名称和类型?

    我知道对于派生 Data Data 的数据类型 constrFields http hackage haskell org package base 4 7 0 2 docs Data Data html v constrFields给出字
  • GHC 可以为 monad 转换器派生 Functor 和 Applicative 实例吗?

    我正在尝试实施MaybeT本着mtl图书馆 使用这个非编译解决方案 LANGUAGE FlexibleInstances MultiParamTypeClasses UndecidableInstances import Control M
  • 显示未定义的实例

    可以采取任何措施来为未定义的值定义 Show 实例吗 也许存在一些 GHC 扩展 我想要这样的东西 gt print 1 undefined 1 undefined 根据Haskell 2010 报告 第 9 章 http www hask
  • Haskell/GHC:使用相同模式匹配多个一元构造函数

    所以我正在尝试定义 TrieSet 数据类型 尽管我知道我不需要 http hackage haskell org package TrieMap module Temp where import Data Map data TrieSet
  • 如何在 Yesod 中使用 CSS 框架?

    我想将 Blueprint CSS 框架与 Yesod 一起使用 有没有最佳实践 因为 Yesod 使用 CSS 模板 所以在我看来我不能直接使用 css 文件 我必须将它们重命名为 lucius files 吗 如何将 CSS 添加到 d
  • 生成所有可能的树

    给定以下数据类型定义 data FormTree Empty Node FormTree FormTree deriving Show 我想编写一个函数 它生成一个无限列表 其中包含按长度排序的所有可能的树 例如节点数量 下面的代码几乎满足
  • 为什么 Haskell 中有协函子和逆变函子的区别,而范畴论却没有区别?

    这个答案是从范畴论的角度来看的 https math stackexchange com a 661989 72174包括以下语句 事实是 协函子和逆变函子之间没有真正的区别 因为每个函子只是一个协变函子 More in details a
  • 导入 Haskell 模块

    我是哈斯克尔的新手 为什么当我尝试使用时Days from Data Time我收到此错误 Could not find module Data Time It is a member of the hidden package time
  • ErrorT 已弃用,但 exceptT 不适合

    我有一个一元计算 在某些时候 由于单子模式匹配 它开始需要 MonadFail 约束 我的简单解决方法是使用以下命令运行它 fmap either error id runErrorT 然而哎呀 Deprecated Use Control

随机推荐

  • 使用 SciPy 进行逻辑回归

    我正在尝试使用 SciPy 在 Python 中编写逻辑回归代码fmin bfgs功能 但遇到了一些问题 我为逻辑 S形 变换函数和成本函数编写了函数 这些函数工作得很好 我使用了通过固定软件找到的参数向量的优化值来测试这些函数 并且这些函
  • XPath - 如何选择节点的子元素?

    我有一个包含 XHTML 表的 XmlDocument 我想循环遍历它以一次处理一行表格单元格 但下面的代码返回嵌套循环中的所有单元格 而不仅仅是当前行的单元格 XmlNodeList tableRows xdoc SelectNodes
  • .net core 中的 httprequest.UserHostName

    在 HttpRequest 上找不到 UserHostName 属性 任何论坛上都没有任何关于它的信息 这个已经被放弃了吗 任何想法 接受的答案不正确 someHttpContext Request Host对应于HostHTTP 请求中使
  • LINQ to SQL 设计器错误

    每次我在保存后更改设计器中的值时 designer cs 文件都会被删除 谁能告诉我如何解决这个问题 Move using您的指令DataContext cs and DataContext designer cs文件到namespace
  • 如何将 AJAX 检索到的值返回到 JavaScript 中当前函数的父函数?

    我有以下 JavaScript 和 jQuery 代码 function checkEmail email if email length getJSON ajax validate email email function data if
  • Node.js:获取已安装 npm 包的(绝对)根路径

    Task 我正在寻找一种通用方法来获取 Node js 中已安装 npm 包的 绝对 根路径 Problem 我知道关于require resolve 但这会给我入口点 主模块的路径 而不是包的根路径 Take bootstrap sass
  • 获取“td”元素的 jquery 索引

    我有标记 table tr td p class que 1 Who are you p td tr tr class ans td td tr table
  • 将文件(如对象)附加到电子邮件 python 3

    我在网上找到了很多有关如何将本地文件附加到电子邮件的示例 我想做的是将一个类似对象的文件附加到电子邮件中 你为什么问 所以我不必处理清理文件的问题 下面是我的代码和我的错误 经过多次谷歌搜索后 我仍然没有设法让它工作 任何帮助将不胜感激 d
  • Chrome 扩展:如何处理浏览器的禁用和启用事件

    有没有办法在 Chrome 浏览器禁用 启用扩展程序后运行回调 Chrome 管理 API chrome management onEnabled addListener function ExtensionInfo info chrome
  • 如何在over函数中使用partition by和order by?

    我正在使用 SQL Server 2008 R2 我正在尝试编写一个显示以下内容的查询 select productname unitprice categoryid sum unitprice over partition by cate
  • php.ini 中的 pack()非法十六进制数字警告

    我在 php 中使用 pack 时遇到一些问题 currencypair EUR USD buy sell buy alert device token array a a b message Your currencypair buy s
  • 在 Windows 版 Git 中使用 GIT_SSH_COMMAND

    我现在使用的是适用于 Windows 2 x 的 Git 第四个候选版本 并在 shell 中使用 GIT SSH COMMAND 来避免 SSH 的主机验证 在 Git Bash 中我写了这样的内容 GIT SSH COMMAND ssh
  • 警告 MSB3391: 不包含任何可以为 COM 互操作取消注册的类型

    我使用 VS2005 制作了一个简单的 C DLL 这是一个更大项目的一部分 我需要通过 VBA 代码在 Excel 中使用 DLL 因此我在程序集上使用 COM Interop 我是试图让构建过程自动生成必要的TLB文件这样我就不需要在每
  • Android-从活动启动另一个应用程序[重复]

    这个问题在这里已经有答案了 我想创建一个在单击按钮时启动外部应用程序 例如 Shazam 的活动 是否可以 如何做呢 Thanks 您需要其他应用程序包名称 如果您安装了此应用程序 可以使用 adb 检查 adb shell cmd 软件包
  • .NET 6 问题:承载错误=“invalid_token”

    我正在使用 NET 6 构建 API 但遇到了这个错误 我通过登录获得了一个令牌 然后将该令牌添加到标头中 但总是出现 401 未经授权的错误 注意 我收到 Bearer error invalid token 但是没有描述 这是我的代码
  • 如何让 Php 的stream_socket保持活动状态?

    我有一个使用stream socket client 的Php应用程序 通过tcp从后端服务器获取数据 但希望保持连接处于活动状态 甚至更好地放在池或其他东西中 以避免连接 断开连接的开销 但我不是 PHP 大师 所以我不知道如何做到这一点
  • 如何使用 Checkstyle 停止 Maven 构建

    我已经成功地使用 Maven 和 Checkstyle 插件 并且可以创建关于我的代码的报告 但我真正想要的是 如果样式检查出现任何错误 我可以停止 Maven 的构建过程 到目前为止我的pom xml如下所示
  • 为什么我会在 IE8 中触发怪异模式?

    我正在开发一个页面 当我加载到 IE8 并查看开发人员工具时 它告诉我页面默认为怪异模式 我有一个严格的 DTD 我什至继续进行明确的标准切换 尽管我认为我不需要这样做 我不明白为什么页面默认不是 IE8 标准 我唯一能想到的是 要访问此页
  • 全局隐藏光标(来自后台应用程序)

    我想从状态栏应用程序中隐藏光标 并且我已经做了一些研究 似乎不久前就找到了这个问题的解决方案 在 Cocoa Carbon 中全局隐藏鼠标光标 or http lists apple com archives carbon dev 2006
  • 如何解构 SNat(单例)

    我正在 Haskell 中试验依赖类型 并在paper 单身人士 包的 replicate2 forall n a SingI n gt a gt Vec a n replicate2 a case sing Sing n of SZero