首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以教GHC数学归纳法吗?

我可以教GHC数学归纳法吗?
EN

Stack Overflow用户
提问于 2021-08-24 23:13:50
回答 1查看 124关注 0票数 4

我尝试创建一个表示无限多个类型的元组的数据类型:

代码语言:javascript
运行
复制
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}

import GHC.TypeNats

infixr 5 :!!

data OmegaTuple (t :: Nat -> *) (n :: Nat) = t n :!! OmegaTuple t (n+1)

这很好。

我还试图声明无限多个半群的直积:

代码语言:javascript
运行
复制
instance (Semigroup (t n), Semigroup (OmegaTuple t (n+1))) => Semigroup (OmegaTuple t n) where
    (x :!! xs) <> (y :!! ys) = x <> y :!! xs <> ys

然而GHC像这样抱怨:

代码语言:javascript
运行
复制
• Illegal nested constraint ‘Semigroup (OmegaTuple t (n + 1))’
  (Use UndecidableInstances to permit this)

如果我没理解错的话,使用UndecidableInstances会使GHC陷入无限循环。

另一次尝试:

代码语言:javascript
运行
复制
instance (Semigroup (t n), forall k. Semigroup (t k) => Semigroup (t (k+1))) => Semigroup (OmegaTuple t n) where
    (x :!! xs) <> (y :!! ys) = x <> y :!! xs <> ys

然后GHC像这样抱怨:

代码语言:javascript
运行
复制
• Illegal type synonym family application ‘k + 1’ in instance:
    Semigroup (t (k + 1))

教GHC数学归纳法真的不可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-25 07:43:56

你可以手动包装字典,这样就可以懒洋洋地建立一个“无限类字典”:

代码语言:javascript
运行
复制
{-# LANGUAGE GADTs     #-}
{-# LANGUAGE DataKinds #-}
 
import Data.Kind (Type)
import GHC.TypeLits

data SemigroupSequence (t :: Nat -> Type) (n :: Nat) where
  SemigroupSequence :: Semigroup (t n)
     => SemigroupSequence t (n+1) -> SemigroupSequence t n

class SemigroupFamily t where
  semigroupSequence :: SemigroupSequence t 0

然后

代码语言:javascript
运行
复制
mappendOmega :: SemigroupSequence t n
     -> OmegaTuple t n -> OmegaTuple t n -> OmegaTuple t n
mappendOmega (SemigroupSequence sd') (x :!! xs) (y :!! ys)
   = x <> y :!! mappendOmega sd' xs ys

instance (SemigroupFamily t) => Semigroup (OmegaTuple t 0) where
  (<>) = mappendOmega semigroupSequence
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68915039

复制
相关文章

相似问题

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