gpt4 book ai didi

字符串的 Haskell 类型强制

转载 作者:行者123 更新时间:2023-12-01 07:55:03 25 4
gpt4 key购买 nike

在此代码中,我可以构建一个列表 Algo s 使用一些直接构造函数,如 LitNom ,但也来自整数。这是因为 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"自动“转换”为 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"]

关于字符串的 Haskell 类型强制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30029979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com