haskell - 使用重载字符串

标签 haskell language-extension ghcjs overloaded-strings

OverloadedStrings扩展确实非常有用,但是它有一些缺点。
考虑以下函数定义:

someFunction :: ToJSSTring a => a -> IO ()
someFunction = js_function . toJSSTring

在这种情况下,如果我想传递一个文字值,我必须在 OverloadedStrings 时显式添加类型签名。已启用:
someFunction ("This is plain string" :: String)
someFunction ("And this one is Text" :: Data.Text.Text)

这种必要性的原因很明显,我想OverloadedStrings旨在简化将文字值传递给具有严格类型签名的函数,使开发人员无需编写 pack s 到处都是 Text需要值(value)。

问题是有什么方法可以将所有没有类型签名的字符串文字默认为 Text , 或 String ?或者我应该将我的代码拆分为通用函数(带有 ToJSString 类型约束)和任意函数,它们的参数具有严格的类型签名?

最佳答案

您可以开启ExtendedDefaultRules以及(https://www.fpcomplete.com/user/snoyberg/random-code-snippets/overloadedstrings-defaults):

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ExtendedDefaultRules #-}
import Data.Text (Text, pack)

newtype JSString = JSString Text
    deriving Show

class ToJSString a where
    toJSString :: a -> JSString
instance ToJSString [Char] where
    toJSString = toJSString . pack
instance ToJSString Text where
    toJSString = JSString

someFunction :: ToJSString a => a -> IO ()
someFunction = print . toJSString

main :: IO ()
main = someFunction "Hello World"

编辑 您可能还想添加 default (Text)到你的模块顶部让它使用Text而不是 String默认。

关于haskell - 使用重载字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26778415/

相关文章:

haskell - 为什么 GeneralizedNewtype 不派生一个安全的 Haskell?

haskell - 在什么情况下 NegativeLiterals 会改变行为?

C++ 模块 - 为什么从 C++0x 中删除它们?他们以后会回来吗?

javascript - GHCJS:如何使用 FFI 导入高阶 javascript 函数?

haskell - GHC 多包版本警告的严重性

haskell - 如何在 Haskell Gloss 中隐藏鼠标光标

haskell - cabal 安装 hspec 时出错

haskell - 偏向 Monad 变压器

haskell - 使用 reflex/reflex-dom 的 Xhr 请求

haskell - GHCJS-DOM 事件指导