haskell - Haskell 中是否有 "Safe"替代 Data.String.Utils 的 'replace'?

标签 haskell

我无法标记为 "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/

相关文章:

haskell - 如果 cabal 或工作目录设置为项目目录,Emacs Interactive-Haskell repl 无响应

haskell - 纯函数怎么做IO?

Haskell,是否有可能创建一个可以 curry 任意数量的元组元素的 curry 函数

haskell - $ 和 () 的区别

haskell - Intero 始终安装独立的 GHC

haskell - 函数在参数后面写函数

haskell - 在foldl中,这些是实际数字还是只是数字的占位符?

scala - 为什么我们需要 "Algebraic Data Types"?

haskell - 用 `catchError`写一串 `(<|>)` -s吗?

haskell - Haskell 中只有一个参数的 (==) 类型是什么