Haskell类型强制用于字符串

时间:2015-05-04 12:17:13

标签: haskell

在此代码中,我能够使用AlgoLit之类的直接构造函数构建Nom列表,但也可以使用整数构建Algo列表。这是因为Num派生type Nr = Double data Algo = Nom Nr | Lit String | Und deriving (Show) instance Num Algo where (+) (Nom a) (Nom b)=Nom(a+b) (+) _ _=Und (*) (Nom a) (Nom b)=Nom(a*b) (*) _ _=Und abs (Nom a)=Nom(abs a) abs _=Und signum (Nom a)=Nom(signum a) signum _=Und fromInteger a=Nom(fromInteger a) main=do print ([1,2,3,Und,Nom 5,Lit "x"]::[Algo])

是否可以为字符串做类似的事情?

[Nom 1.0,Nom 2.0,Nom 3.0,Und,Nom 5.0,Lit "x"]

运行正常结果:

print (["test",1,2,3,Und,Nom 5,Lit "x"]::[Algo])

所需代码:

$("#fotorama_right_div").on("click", 'img', function() {    
$('#fotorama_right_div').one('fotorama:showend', function (e, fotorama) {
    console.log($(fotorama.activeFrame).attr('url'));
});});

当然会给出错误...... 转换发生在哪里?在解析/编译?

readPrec没有帮助

1 个答案:

答案 0 :(得分:11)

要让"test"自动“转换”为Algo,您需要定义IsString的实例,然后使用GHC扩展OverloadedStrings

instance IsString Algo where
  fromString = Lit

Live demo

以便以下方法正常运行:

print ["test", 1, 2, 3, Und, Nom 5, Lit "x"]
-- [Lit "test",Nom 1.0,Nom 2.0,Nom 3.0,Und,Nom 5.0,Lit "x"]