Profunctor Iso 不进行类型检查
Profunctor Iso doesn't type check
我正在尝试在 Idris 中实现最简单的profunctor optic。 Iso 是一个在所有发音器中都应该是多态的函数。我认为这是正确的语法。
除最终测试外,所有内容都进行类型检查。
interface Profunctor (p : Type -> Type -> Type) where
dimap : (a' -> a) -> (b -> b') -> p a b -> p a' b'
Iso : Type -> Type -> Type -> Type -> Type
Iso a b s t = {p : Type -> Type -> Type} -> Profunctor p => p a b -> p s t
-- A pair of functions
data PairFun : Type -> Type -> Type -> Type -> Type where
MkPair : (s -> a) -> (b -> t) -> PairFun a b s t
-- PairFun a b s t is a Profunctor in s t
Profunctor (PairFun a b) where
dimap f g (MkPair get set) = MkPair (get . f) (g . set)
-- Extract a pair of functions from an Iso
fromIso : Iso a b s t -> PairFun a b s t
fromIso iso = iso (MkPair id id)
-- Turn a pair of functions to an Iso
toIso : PairFun a b s t -> Iso a b s t
toIso (MkPair get set) = dimap get set
-- forall p. Profunctor p => p Int Int -> p Char String
myIso : Iso Int Int Char String
myIso = toIso (MkPair ord show)
x : PairFun Int Int Char String
x = fromIso myIso
我遇到了这个错误。看起来 Idris 在抱怨 p1 是 Profunctor 的假设,但这是 Iso 定义中的约束。
Can't find implementation for Profunctor p1
Type mismatch between
p1 Int Int -> p1 Char String (Type of myIso p1
constraint)
and
p Int Int -> p Char String (Expected type)
Specifically:
Type mismatch between
p1 Int Int
and
p Int Int
以下代码适用于 Idris 2 0.3 版。这是 Idris 2 的一个相当旧的版本,但它可能也适用于更新的版本。
interface Profunctor (0 p : Type -> Type -> Type) where
dimap : (a' -> a) -> (b -> b') -> p a b -> p a' b'
Iso : Type -> Type -> Type -> Type -> Type
Iso a b s t = {0 p : Type -> Type -> Type} -> Profunctor p => p a b -> p s t
data PairFun : Type -> Type -> Type -> Type -> Type where
MkPair : (s -> a) -> (b -> t) -> PairFun a b s t
Profunctor (PairFun a b) where
dimap f g (MkPair get set) = MkPair (get . f) (g . set)
fromIso : Iso a b s t -> PairFun a b s t
fromIso iso = iso (MkPair id id)
toIso : PairFun a b s t -> Iso a b s t
toIso (MkPair get set) = dimap get set
myIso : Iso Int Int Char String
myIso = toIso (MkPair ord show)
x : PairFun Int Int Char String
x = fromIso myIso
不幸的是,我不知道如何在 Idris 1 中完成这项工作。问题似乎是 p
的生成性:阐述者没有从 p1 a b = p2 a b
推断出 p1 = p2
.在任何 Idrises 中,这通常都不成立,因为 p1
和 p2
可以是任意函数。 Idris 2 似乎在某个时刻继续 p1 = p2
;这是一个便利的功能,但会牺牲一些推理的稳健性。
上面代码中 p
上的不相关注释与我刚才提到的生成性问题无关,它们只是重现 Idris 1 和 GHC 行为所必需的。在 Idris 2 中,隐式引入的变量总是具有 0
多重性,因此我们必须同时删除 p
,以便能够将其应用于 0
类型参数。此外,0 p
匹配 Idris 1 / GHC 行为,其中类型通常被删除。在 Idris 2 中,类型仅在与 0
.
绑定时被删除
我正在尝试在 Idris 中实现最简单的profunctor optic。 Iso 是一个在所有发音器中都应该是多态的函数。我认为这是正确的语法。
除最终测试外,所有内容都进行类型检查。
interface Profunctor (p : Type -> Type -> Type) where
dimap : (a' -> a) -> (b -> b') -> p a b -> p a' b'
Iso : Type -> Type -> Type -> Type -> Type
Iso a b s t = {p : Type -> Type -> Type} -> Profunctor p => p a b -> p s t
-- A pair of functions
data PairFun : Type -> Type -> Type -> Type -> Type where
MkPair : (s -> a) -> (b -> t) -> PairFun a b s t
-- PairFun a b s t is a Profunctor in s t
Profunctor (PairFun a b) where
dimap f g (MkPair get set) = MkPair (get . f) (g . set)
-- Extract a pair of functions from an Iso
fromIso : Iso a b s t -> PairFun a b s t
fromIso iso = iso (MkPair id id)
-- Turn a pair of functions to an Iso
toIso : PairFun a b s t -> Iso a b s t
toIso (MkPair get set) = dimap get set
-- forall p. Profunctor p => p Int Int -> p Char String
myIso : Iso Int Int Char String
myIso = toIso (MkPair ord show)
x : PairFun Int Int Char String
x = fromIso myIso
我遇到了这个错误。看起来 Idris 在抱怨 p1 是 Profunctor 的假设,但这是 Iso 定义中的约束。
Can't find implementation for Profunctor p1
Type mismatch between
p1 Int Int -> p1 Char String (Type of myIso p1
constraint)
and
p Int Int -> p Char String (Expected type)
Specifically:
Type mismatch between
p1 Int Int
and
p Int Int
以下代码适用于 Idris 2 0.3 版。这是 Idris 2 的一个相当旧的版本,但它可能也适用于更新的版本。
interface Profunctor (0 p : Type -> Type -> Type) where
dimap : (a' -> a) -> (b -> b') -> p a b -> p a' b'
Iso : Type -> Type -> Type -> Type -> Type
Iso a b s t = {0 p : Type -> Type -> Type} -> Profunctor p => p a b -> p s t
data PairFun : Type -> Type -> Type -> Type -> Type where
MkPair : (s -> a) -> (b -> t) -> PairFun a b s t
Profunctor (PairFun a b) where
dimap f g (MkPair get set) = MkPair (get . f) (g . set)
fromIso : Iso a b s t -> PairFun a b s t
fromIso iso = iso (MkPair id id)
toIso : PairFun a b s t -> Iso a b s t
toIso (MkPair get set) = dimap get set
myIso : Iso Int Int Char String
myIso = toIso (MkPair ord show)
x : PairFun Int Int Char String
x = fromIso myIso
不幸的是,我不知道如何在 Idris 1 中完成这项工作。问题似乎是 p
的生成性:阐述者没有从 p1 a b = p2 a b
推断出 p1 = p2
.在任何 Idrises 中,这通常都不成立,因为 p1
和 p2
可以是任意函数。 Idris 2 似乎在某个时刻继续 p1 = p2
;这是一个便利的功能,但会牺牲一些推理的稳健性。
上面代码中 p
上的不相关注释与我刚才提到的生成性问题无关,它们只是重现 Idris 1 和 GHC 行为所必需的。在 Idris 2 中,隐式引入的变量总是具有 0
多重性,因此我们必须同时删除 p
,以便能够将其应用于 0
类型参数。此外,0 p
匹配 Idris 1 / GHC 行为,其中类型通常被删除。在 Idris 2 中,类型仅在与 0
.