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