首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Haskell中定义恒定的异构流?

如何在Haskell中定义恒定的异构流?
EN

Stack Overflow用户
提问于 2021-11-23 14:45:20
回答 1查看 159关注 0票数 8

我理解如何在Haskell中定义同构流和异构流。

代码语言:javascript
复制
-- Type-invariant streams.
data InvStream a where
   (:::) :: a -> InvStream a -> InvStream a

-- Heterogeneous Streams.
data HStream :: InvStream * -> * where
   HCons :: x -> HStream xs -> HStream (x '::: xs)

我们如何将常量流定义为异构流的特定情况?如果我试图定义一个常量类型流的类型系列,就会得到一个“还原堆栈溢出”错误。我认为这与类型检查算法不够懒惰和试图计算整个Constant a流类型有关。

代码语言:javascript
复制
type family Constant (a :: *) :: InvStream * where
  Constant a = a '::: Constant a

constantStream :: a -> HStream (Constant a)
constantStream x =  HCons x (constantStream x)

有什么方法可以绕过这个问题并定义常量的异构流吗?还有其他类似的建筑我应该去尝试吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-23 15:55:12

这正是我们在Haskell中所忽视的归纳和共归纳类型之间的区别。但是您不能在类型级别上这样做,因为编译器需要在有限的时间内进行证明。

所以,我们需要的是用共同归纳的方式来表达类型级别的流:

代码语言:javascript
复制
{-# LANGUAGE GADTs, DataKinds, TypeFamilies #-}

import Data.Kind (Type)  -- The kind `*` is obsolete

class TypeStream (s :: Type) where
  type HeadS s :: Type
  type TailS s :: Type

data HStream s where
  HConsS :: HeadS s -> HStream (TailS s) -> HStream s

data Constant a

instance TypeStream (Constant a) where
  type HeadS (Constant a) = a
  type TailS (Constant a) = Constant a

constantStream :: a -> HStream (Constant a)
constantStream x = HConsS x (constantStream x)
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70082903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档