gpt4 book ai didi

haskell - 将字符串文字限制为仅文本

转载 作者:行者123 更新时间:2023-12-02 01:52:22 24 4
gpt4 key购买 nike

我知道 OverloadedStrings 语言编译指示将隐式 fromString 包裹在所有字符串文字周围。我想做的实际上并不是重载字符串,而只是改变它们的含义,以便它们总是变成文本,因此,使用字符串文字作为字符列表应该会导致类型错误。

如果不导入该类的 String 实例,则似乎不可能导入 IsString 类。 ghc 是否提供了某种方法让我将字符串文字限制为仅 Text

最佳答案

这有点矫枉过正,但一个解决方案是将 OverloadedStrings 结合起来和 RebindableSyntax 。 RebindableSyntax 扩展导致 Haskell 语法使用所有隐式函数调用来引用作用域内的任何函数;例如,整数文字使用任何 fromIntegral,不一定是 Prelude.fromIntegral。作为副作用,Prelude 不再隐式导入,因此您必须手动执行此操作。只要您确实导入它,隐式使用错误函数的语法就不应该有任何问题(我想——我实际上并没有使用过这种技术)。与 OverloadedStrings 结合使用时,这会导致 "foo" 转换为 fromString "foo",无论 fromString' s 在范围内,不一定是 Data.String.fromString "foo"。因此,使 fromStringpack 同义即可实现您想要的效果。一个完整的例子:

{-# LANGUAGE OverloadedStrings, RebindableSyntax #-}
import Prelude

import qualified Data.Text as T
import qualified Data.Text.IO as T

fromString :: String -> T.Text
fromString = T.pack

main :: IO ()
main = T.putStrLn "Hello, world!"

这工作正常,将 main 更改为 main = putStrLn "Hello, world!" 会产生所需的错误:

TestStrings.hs:11:17:
Couldn't match expected type `String' with actual type `T.Text'
Expected type: [Char] -> String
Actual type: String -> T.Text
In the first argument of `putStrLn', namely `"Hello, world!"'
In the expression: putStrLn "Hello, world!"

注释掉 fromString 的定义会导致不同的错误:

TestStrings.hs:11:19:
Not in scope: `fromString'
Perhaps you meant `showString' (imported from Prelude)

如果您希望它同时处理严格文本和惰性文本,您可以定义自己的 IsString 类型类,并将它们都创建为实例;该类不必名为 IsString,只要它具有 fromString 方法即可。

另外,警告一下:GHC 手册中关于 RebindableSyntax 的部分没有提到 fromString 函数,而关于 OverloadedStrings 的部分则没有提及code> 没有提到 RebindableSyntax。没有理由这个不应该工作,但我认为这意味着这个解决方案在技术上依赖于未记录的行为。

关于haskell - 将字符串文字限制为仅文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11552764/

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