相关疑难解决方法(0)

我可以通过功能依赖来实现类型相等吗?

我试图得到一些感觉MultiParamTypeClassesFunctionalDependencies了,下面让我觉得一个明显的事情尝试:

{-# LANGUAGE MultiParamTypeClasses
           , FunctionalDependencies
           , TypeOperators #-}

import Data.Type.Equality

class C a b | a -> b

fob :: (C a b, C a b') => proxy a -> b :~: b'
fob _ = Refl
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用; GHC并未b ~ b'从该背景中得出结论.有没有办法使这项工作,或功能依赖不是"内部"可用?

haskell typeclass

19
推荐指数
1
解决办法
468
查看次数

为什么这个Haskell代码使用fundeps进行类型检查,但是对类型系列产生了不可触摸的错误?

给定一些类型定义:

data A
data B (f :: * -> *)
data X (k :: *)
Run Code Online (Sandbox Code Playgroud)

...和这个类型类:

class C k a | k -> a
Run Code Online (Sandbox Code Playgroud)

...这些(为了最小的例子的目的而高度设计)函数定义类型检查:

f :: forall f. (forall k. (C k (B f)) => f k) -> A
f _ = undefined

g :: (forall k. (C k (B X)) => X k) -> A
g = f
Run Code Online (Sandbox Code Playgroud)

但是,如果我们使用类型族而不是具有函数依赖性的类:

type family F (k :: *)
Run Code Online (Sandbox Code Playgroud)

...然后等效的函数定义无法进行类型检查:

f :: forall f. (forall k. (F k ~ B f) => …
Run Code Online (Sandbox Code Playgroud)

haskell type-families functional-dependencies

10
推荐指数
1
解决办法
398
查看次数

将函数依赖重用为类型函数

我有一个使用函数依赖和示例实例的类型类:

\n
class (KnownSymbol name) => MyClass name result | name -> result\n\ninstance MyClass "something" Int\n
Run Code Online (Sandbox Code Playgroud)\n

我如何重用它并获得类型级函数GetType以便GetType "something"返回Int

\n

我不成功的尝试非常天真:

\n
class CanGetType a b | a -> b where\n  type GetType a\n\ninstance (MyClass name result) => CanGetType name result where\n  type GetType name = result\n
Run Code Online (Sandbox Code Playgroud)\n

失败了:

\n
The RHS of an associated type declaration mentions out-of-scope variable \xe2\x80\x98a\xe2\x80\x99\n  All such variables must be bound on the LHS\n
Run Code Online (Sandbox Code Playgroud)\n

haskell

5
推荐指数
0
解决办法
87
查看次数