Haskell类型强制转换与字符串相关

3

在这段代码中,我能够使用一些直接构造函数(例如LitNom),以及整数来构建Algo列表。这是因为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])

这当然会导致错误...

转换是在哪里发生的呢?在解析/编译时吗?

readPrec 也没有帮助


你期望将"test"转换成什么样的内容? - Shoe
将Lit中的“test”自动化,与数字一起测试。 - neu-rah
1个回答

11

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

instance IsString Algo where
  fromString = Lit

实时演示

为了确保以下内容能够正常工作:

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"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接