我无法标记为 "Safe"代码包含,例如
import Data.String.Utils (replace)
preproc :: String -> String
preproc s = foldl1 fmap (uncurry replace <$> subs) s
where subs = [("1","a"),("2","bb"),("3","z"),("4","mr")("0","xx")]
因为(显然)
Data.String.Utils
's 不是“安全的”。replace
是否有安全的替代方案? ?为什么不是 replace
反正安全吗?
最佳答案
tl;博士:import Data.Text (replace)
- 如果你能忍受更受限制的类型签名?
1) Data.String.Utils
模块没有被标记为安全,尽管它应该是。
2) Data.String.Utils
模块是安全的。将其称为“不安全”是错误的,即使您在“安全”周围加上引号。 GHC 告诉您该模块将是不安全的,因为它使用了一种保守的方法:如果它不能在编译时证明该模块是安全的,它会假定它是不安全的。但是无论编译器多么大声地提示模块不安全,它仍然是完全安全的。
3) 另一方面,可以编写一个模块,导出 unsafePerformIO
的某些版本,并将其标记为“值得信赖”。 GHC 会认为该模块可以安全地导入。但实际上,该模块本质上是不安全的。
那么,你现在有什么选择呢?
A) 下载包的源代码,修改你需要的模块,并且你知道它们是安全的,在开头包含一个“Trustworthy”标签:{-# LANGUAGE Trustworthy #-}
(您可以将补丁发送给维护者,也可以留给自己)
B) 你编写自己的 replace
版本并将其标记为安全。
C) 也许你可以使用 replace
来自 Data.Text
.但这仅限于 Text
,而另一个 replace
函数适用于任意列表。
至少在 Hoogle 上[a] -> [a] -> [a] -> [a]
没有其他方法您的用例的签名。
关于haskell - Haskell 中是否有 "Safe"替代 Data.String.Utils 的 'replace'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32701596/