仅在断言中出现的绑定类型变量

时间:2010-03-19 14:13:28

标签: haskell variables class types

我觉得描述我的问题非常困难,所以这里什么都没有:

我对函数的类型有一堆断言。这些断言依赖于一个类型变量,该变量不用于函数的任何参数,但仅用于内部绑定。每当我使用这个函数时它都不会编译,因为当然,编译器没有信息来猜测绑定我的类型变量的类型。这是代码:

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances,
  UndecidableInstances, FlexibleContexts, EmptyDataDecls, ScopedTypeVariables,
  TypeOperators, TypeSynonymInstances #-}

class C a a'  where convert :: a -> a'
class F a b   where apply :: a -> b
class S s a   where select :: s -> a

data CInt = CInt Int

instance S (Int,String) Int where select (i,_) = i
instance F Int CInt where apply = CInt

f :: forall s a b . (S s a, F a b) => s -> b
f s = 
  let v = select s :: a
      y = apply v :: b
  in y

x :: Int
x = f (10,"Pippo")

这是生成的错误:

FunctorsProblems.hs:21:4:
    No instances for (F a Int, S (t, [Char]) a)
      arising from a use of `f' at FunctorsProblems.hs:21:4-17
    Possible fix:
      add an instance declaration for (F a Int, S (t, [Char]) a)
    In the expression: f (10, "Pippo")
    In the definition of `x': x = f (10, "Pippo")
Failed, modules loaded: none.
Prelude>

1 个答案:

答案 0 :(得分:1)

您正在尝试与某些类的实例相交,对于编译器,无法确定此交集将为空或单个条目。
您希望强制编译器为您选择正确的类型,而不知道决策可能会给您的程序带来哪些问题(信息丢失或计算的复杂性)。如果你想这样做,你应该给编译器提示什么是特定对“s”和“b”的最佳类型“a”(与我们指定的FunctionalDependencies一起)。

class E x a | x -> a
instance (S s Int, F Int CInt) => E (s, CInt) Int
f :: forall s a b . (E (s,b) a) => s -> b

可能有一种方法可以为“s”和“b”对指定首选类型“a”的顺序,并进一步推断最佳“a”(即使用类型级别或类似的东西来附加信息)。