- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为强类型文件路径创建一个通用的自由类别(路径)和一个文件系统实例。我希望新的 TypeInType
扩展能够使这种更通用的路径类型成为可能,其中 my earlier efforts早在 2013 年,似乎有必要将文件系统部分绑定(bind)到类别部分,但我遇到了一个问题,即我似乎不被允许将数据系列实例提升到种类级别,即使它已被 接受:kind
在 GHCI 中。
我可能会遗漏一些明显的东西;我已经离开 Haskell 和编程有一段时间了,即便如此,我也算不上高级类型级编程的专家。
我想在 GHC 8 中实现的目标是否可行?
{-# LANGUAGE TypeInType, TypeFamilies, GADTs #-}
import Data.Kind
data family Vertex g
data family Edge g (a :: Vertex g) (b :: Vertex g)
data Path g (a :: Vertex g) (b :: Vertex g) where
Nil :: Path g a a
Cons :: Edge g a b -> Path g b c -> Path g a c
data FileSystem
data instance Vertex FileSystem = Root | Home | Working | Directory | File
data instance Edge FileSystem where
RootDirectory :: Edge FileSystem Root Directory
HomeDirectory :: Edge FileSystem Home Directory
WorkingDirectory :: Edge FileSystem Working Directory
DirectoryName :: String -> Edge FileSystem Directory Directory
FileName :: String -> Edge FileSystem Directory File
FileExtension :: String -> Edge FileSystem File File
$ ghc Path.hs
[1 of 1] Compiling Main ( Path.hs, Path.o )
Path.hs:18:38: error:
• Data constructor ‘Root’ cannot be used here
(it comes from a data family instance)
• In the second argument of ‘Edge’, namely ‘Root’
In the type ‘Edge FileSystem Root Directory’
In the definition of data constructor ‘RootDirectory’
注释掉代码编译的 Edge FileSystem
声明,我可以在 GHCi 中尝试一些东西。
*Main> :set -XTypeInType -XTypeFamilies -XGADTs
*Main> :k Edge FileSystem
Edge FileSystem :: Vertex FileSystem -> Vertex FileSystem -> *
*Main> :k Root
Root :: Vertex FileSystem
*Main> :k Edge FileSystem Root Directory
Edge FileSystem Root Directory :: *
最佳答案
我认为您的解决方案过于复杂。这些 Node
和 Edge
数据系列是导致错误的原因 - data families aren't promoted ,即使使用 TypeInType
- 并且他们没有在以下更简单的设计上添加任何内容:
infixr 5 :>
data Path (g :: k -> k -> *) (x :: k) (y :: k) where
Nil :: Path g x x
(:>) :: g x y -> Path g y z -> Path g x z
Path g
是一个 g
的类型对齐列表,这样 g
的类型就像多米诺骨牌一样连接起来。或者,将类型视为集合,Path g
是有向图的自由范畴中的态射类型,其中节点位于 k
中,边位于 g::k 中-> k -> *
。或者,将g
视为逻辑关系,Path g
是g
的自反传递闭包。
在此实例中,k
和 g
分别是以下 FileSystemItem
和 FileSystemPart
类型:
data FileSystemItem = Root | Home | Working | Directory | File
data FileSystemPart (dir :: FileSystemItem) (base :: FileSystemItem) where
RootDirectory :: FileSystemPart Root Directory
HomeDirectory :: FileSystemPart Home Directory
WorkingDirectory :: FileSystemPart Working Directory
DirectoryName :: String -> FileSystemPart Directory Directory
FileName :: String -> FileSystemPart Directory File
FileExtension :: String -> FileSystemPart File File
type FileSystemPath = Path FileSystemPart
因此,FileSystemPath
是 FileSystemItem
类别中的态射集合:
ghci> :k FileSystemPath
FileSystemPath :: FileSystemItem -> FileSystemItem -> *
例如:
myDocument :: FileSystemPath Home File
myDocument = HomeDirectory :> DirectoryName "documents" :> FileName "foo" :> FileExtension "hs" :> Nil
请注意,您不需要 TypeInType
或 TypeFamilies
重型机械 - 您只需要 PolyKinds
来定义种类多态Path
、DataKinds
以及文件系统本身的 GADT
。
关于haskell - 使用 TypeInType 进行数据族实例的种类提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39410968/
我正在为我的项目使用 Google Cloud Datastore(而非 NDB)。 python2.7 和 Django。 我想创建一个新模型,比如说 Tag 模型。 class Tag(db.Mo
我正在研究使用 monad 推导式来表示 SQL 查询,并生成适当的 SQL。乍一看,这不是问题,看起来很合适。但我必须限制类型,这些类型只能形成产品的单子(monad),而不是总和,而且我想不出一种
在Foldable文档,我看到以下实例: (Foldable f, Foldable g) => Foldable (Compose * * f g) 如果我查看 Compose 的定义,我看到它被声
给定一个团队->运动员关系并查询所有运动员。什么 我对fetch="Join"有误解吗?该映射是否应引起 通过联接加载团队?在对运动员进行迭代时 仍然懒惰地加载团队。 public class Ath
我才刚刚开始熟悉类型的概念,所以如果我没有很好地表达我的问题,请耐心等待...... 值有类型: 3 :: Int [1,2,3] :: [Int] ('c',True) :: (Char,Bool)
这里是我在 javascript 中的一个数组,效果很好! _rowData: [ { name: "Most Recent", view: "recentView" }, { nam
我正在尝试绘制 pandas Series用一条线。 这些线产生显示的输出和散点图。 import pandas as pd print(pd.__version__) ... print(type(
我正在使用 gcloud npm 模块。提前致谢。 我尝试了很多,但什么也没得到。 最佳答案 您需要对该实体进行查询并计算结果。 var query = ds.createQuery('EntityK
一些上下文 我对 libclang 不是很熟悉。我只是修改一个使用 the python bindings to libclang 的 vim 插件. 有一个 python 函数接收游标参数。当前 C
我有一个链接到 zlib v1.2.3 的程序,它出现以下错误: deflateEnd error 'no msg' kind: 'Z_DATA_ERROR': -3 该程序已成功处理许多要压缩的不同
我正在尝试通过遵循 the docs 来实现 log4rs .我的目标是将 info!("INFO") 的结果放入文件 requests.log,但出现错误: thread 'main' panick
Program type already present: org.apache.http.ContentTooLongException Message{kind=ERROR, text=Progr
当我执行 ng generate component faqs 时,我无法将新组件添加到我的 Nativescript 项目中它返回错误: Option "entryComponent" is dep
我是一名优秀的程序员,十分优秀!