Generics Haskell中的类型模式

Generics Haskell中的类型模式,generics,haskell,Generics,Haskell,我试图编译一个在Haskell中看到的泛型类/类型模式的简单示例,但它无法编译。任何关于代码错误的想法都会很有帮助 根据文档,应该有一个带有数据类型单元、:*:、和:+:的模块泛型,但ghc 6.12.1关于不在范围内的投诉:数据构造函数“单元”等 似乎有一个数据类型为:*、:+:和U的即时泛型包,但是当我导入该模块而不是泛型时,我会得到错误 Illegal type pattern in the generic bindings {myPrint _ = ""} 完整的源代码是 im

我试图编译一个在Haskell中看到的泛型类/类型模式的简单示例,但它无法编译。任何关于代码错误的想法都会很有帮助

根据文档,应该有一个带有数据类型单元、:*:、和:+:的模块泛型,但ghc 6.12.1关于不在范围内的投诉:数据构造函数“单元”等

似乎有一个数据类型为:*、:+:和U的即时泛型包,但是当我导入该模块而不是泛型时,我会得到错误

Illegal type pattern in the generic bindings
    {myPrint _ = ""}
完整的源代码是

import Generics.Instant

class MyPrint a where
  myPrint :: a -> String

  myPrint {| U |} _ = "" 
  myPrint {| a :*: b |} (x :*: y) = "" (show x) ++ ":*:" ++ (show y)
  myPrint {| a :+: b |} _ = ""


data Foo = Foo String

instance MyPrint a => MyPrint a

main = myPrint $ Foo "hi"
我使用

ghc --make Foo.hs -fglasgow-exts -XGenerics -XUndecidableInstances
另外,模块泛型不导出数据类型,只导出函数:

canDoGenerics
mkGenericRhs
mkTyConGenericBinds
validGenericInstanceType
validGenericMethodType

好的,我对泛型不太了解,但是你要找的符号在Data.generics模块中,所以我找到了

import Data.Generics
第二,线路

myPrint {| a :*: b |} (x :*: y) = "" (show x) ++ ":*:" ++ (show y)
有两个问题:第一,价格明显过高。其次,您不能使用show,因为所使用的类型不一定是ShowTypeClass的实例。所以我说了这句话

myPrint {| a :*: b |} (x :*: y) = (myPrint x) ++ ":*:" ++ (myPrint y)
最后,与

instance MyPrint a => MyPrint a
首先要求a是MyPrint的实例,然后要求编译器为已存在的a派生MyPrint实例。这对我很有用:

instance MyPrint Foo
但是,您必须首先手动提供String的实例,以便编译器有一个派生的起点:

instance MyPrint String where
  myPrint s = s

希望这能有所帮助。

好的,我对泛型不太了解,但您要查找的符号在Data.generics模块中,所以我找到了

import Data.Generics
第二,线路

myPrint {| a :*: b |} (x :*: y) = "" (show x) ++ ":*:" ++ (show y)
有两个问题:第一,价格明显过高。其次,您不能使用show,因为所使用的类型不一定是ShowTypeClass的实例。所以我说了这句话

myPrint {| a :*: b |} (x :*: y) = (myPrint x) ++ ":*:" ++ (myPrint y)
最后,与

instance MyPrint a => MyPrint a
首先要求a是MyPrint的实例,然后要求编译器为已存在的a派生MyPrint实例。这对我很有用:

instance MyPrint Foo
但是,您必须首先手动提供String的实例,以便编译器有一个派生的起点:

instance MyPrint String where
  myPrint s = s
希望有帮助