我试图得到一些感觉MultiParamTypeClasses和FunctionalDependencies了,下面让我觉得一个明显的事情尝试:
{-# 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'从该背景中得出结论.有没有办法使这项工作,或功能依赖不是"内部"可用?
给定一些类型定义:
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) 我有一个使用函数依赖和示例实例的类型类:
\nclass (KnownSymbol name) => MyClass name result | name -> result\n\ninstance MyClass "something" Int\nRun Code Online (Sandbox Code Playgroud)\n我如何重用它并获得类型级函数GetType以便GetType "something"返回Int?
我不成功的尝试非常天真:
\nclass CanGetType a b | a -> b where\n type GetType a\n\ninstance (MyClass name result) => CanGetType name result where\n type GetType name = result\nRun Code Online (Sandbox Code Playgroud)\n失败了:
\nThe 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\nRun Code Online (Sandbox Code Playgroud)\n