小编ale*_*404的帖子

在Monad中生成Rank2Type

所以我理解了Rank2Types,但是当我尝试以下内容时

{-# LANGUAGE ImpredicativeTypes, RankNTypes #-}

import Data.Machine

f :: IO (Process a a)
f = return . auto $ id
Run Code Online (Sandbox Code Playgroud)

GHC咳嗽出来

Couldn't match type `MachineT m0 (Is a0) a0'
              with `forall (m :: * -> *). Monad m => MachineT m (Is a) a'
Expected type: IO (Process a a)
  Actual type: IO (MachineT m0 (Is a0) a0)
In the expression: return . auto $ id
In an equation for `f': f = return . auto $ id
Failed, …
Run Code Online (Sandbox Code Playgroud)

haskell higher-rank-types

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

在类型列表上映射依赖类型

我认为从简单的代码中理解我的问题相当简单,但另一方面,我不确定答案!直觉上,我想要做的是给出一个类型列表[*]和一些依赖类型Foo,生成类型[Foo*].也就是说,我想在基类型上"映射"依赖类型.

首先,我正在使用以下扩展

{-# LANGUAGE TypeOperators,DataKinds,GADTs,TypeFamilies #-}
Run Code Online (Sandbox Code Playgroud)

假设我们有一些依赖类型

class Distribution m where
    type SampleSpace m :: *
Run Code Online (Sandbox Code Playgroud)

它表征了一些概率分布的样本空间.如果我们想要在可能异构的值上定义产品分布,我们可能会写类似的东西

data PDistribution (ms :: [*]) where
    DNil :: PDistribution ('[])
    (:*:) :: Distribution m => m -> (PDistribution ms) -> PDistribution (m ': ms)
Run Code Online (Sandbox Code Playgroud)

并补充它

data PSampleSpace (m :: [*]) where
    SSNil :: PSampleSpace ('[])
    (:+:) :: Distribution m => SampleSpace m -> (PSampleSpace ms) -> PSampleSpace (m ': ms)
Run Code Online (Sandbox Code Playgroud)

这样我们就可以定义了

instance Distribution (PDistribution ms) where
    type SampleSpace (PDistribution ms) = PSampleSpace ms …
Run Code Online (Sandbox Code Playgroud)

haskell type-families data-kinds

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