我知道OverloadedStrings
语言编译指示包含fromString
所有字符串文字的隐含.我想要做的不是实际上重载字符串,而只是改变它们的含义以便它们总是被转换为Text
,因此,使用字符串文字作为字符列表应该导致类型错误.
如果不导入IsString
该类的String
实例,则导入该类似乎是不可能的.ghc是否为我提供了一些限制字符串文字的方法Text
?
我已经启用了重载字符串,但我无法让它们工作:
$ cat overloadedstrings.hs
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
lazy :: BL.ByteString
lazy = "I'm a lazy ByteString"
strict :: B.ByteString
strict = "I'm a strict ByteString"
$ ghci
GHCi, version 6.12.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :l overloadedstrings.hs
[1 of 1] Compiling Main ( overloadedstrings.hs, interpreted )
overloadedstrings.hs:7:7:
No …
Run Code Online (Sandbox Code Playgroud) OverloadedStrings
扩展非常有用,但它有一些缺点.请考虑以下函数定义:
someFunction :: ToJSSTring a => a -> IO ()
someFunction = js_function . toJSSTring
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果我想传递一个文字值,我必须在OverloadedStrings
启用时显式添加一个类型签名:
someFunction ("This is plain string" :: String)
someFunction ("And this one is Text" :: Data.Text.Text)
Run Code Online (Sandbox Code Playgroud)
这种必要性的原因是非常明显的,我想这OverloadedStrings
是为了简化文字值传递给具有严格类型签名的函数,使开发人员无需在pack
任何Text
需要值的地方编写代码.
问题是,有没有办法,默认所有没有类型签名的字符串文字Text
,或String
?或者我应该将我的代码拆分为一般函数(使用ToJSString
类型约束)和任意函数,它们的参数具有严格的类型签名?
使用时-XOverloadedStrings
你可以实现IsString
只需要一个函数fromString
。现在,如果您想使用字符串文字进行模式匹配,您还必须实现Eq
,这是有道理的:
f :: MyString -> Bool
f "foo" = True
f _ = False
-- equivalent to
f x
| x == fromString "foo" = True
| otherwise = False
Run Code Online (Sandbox Code Playgroud)
但是,为什么使用的IsList
类型类-XOverloadedLists
需要您实现toList
?在wiki 中,唯一提到的用例toList
是模式匹配。我知道这Eq
对于列表模式匹配是不够的。但后来toList
应该是在唯一需要不同类型的类,如果你想使用列表模式匹配与你的类型,就像IsString
没有要求 Eq
。
对我来说,令人讨厌的事情是fromList . toList = id
必须满足条件,但是对于某些类型(例如无序集合,它不能保证元素的顺序保持不变),这根本无法保证。
这似乎非常不一致。
模式匹配时我收到一个好奇的警告,但只有当OverloadedStrings被启用时...
$ ghci -Wall
GHCi, version 6.12.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> let f x = case (x :: [String]) of {[""] -> "root"; ["product", _] -> "product"; _ -> "unknown"}
Prelude> :q
Leaving GHCi.
$ ghci -Wall -XOverloadedStrings
GHCi, version 6.12.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... …
Run Code Online (Sandbox Code Playgroud) 我有这部分代码,它给了我标题中的错误.
$k
每张桌子的计数从1到5.
$myarray
由至少3到4个名字组成.
错误发生在$qu .=
......
我试过到目前为止:改变VARIABLENAME $i
到$v{$i}
的$qu .=
线路.
那么有没有可能迭代查询?因此它AND
在WHERE
子句中的数量与数组的数量一样多吗?
while ($k<=5) {
$queryname = "SELECT Name FROM description";
$qname = mysql_query($queryname,$link);
while ($reihe = mysql_fetch_object($qname)) {
{
$unse = unserialize($reihe->Name);
{
foreach ($unse as $j=>$h)
foreach ($h as $m) {
$myarray = preg_split('/ |\s| /',$m);
{
echo "<br>";
$array_empty = $myarray;
$empty_elements = array("");
$myarray = array_diff($array_empty,$empty_elements);
var_dump($myarray);
for ($i=1; $i<=count($myarray); $i++) {
$v{$i} = $myarray[$i];
echo …
Run Code Online (Sandbox Code Playgroud) 我将(严格)传递ByteString
给期望a的东西System.IO.FilePath
,声明为type FilePath = String
.我也在用{-# LANGUAGE OverloadedStrings #-}
.我在某些地方的转换是自动发生的,但在这里却没有.我有什么问题?
Main.hs:33:40: error:
• Couldn't match type ‘ByteString’ with ‘[Char]’
Expected type: FilePath
Actual type: ByteString
Run Code Online (Sandbox Code Playgroud) 我意识到我的文本中的重音转换为 .我将其归结为以下示例,该示例写入(并覆盖)文件test.txt.
它只使用Data.Text中的方法,它们应该处理unicode文本.我检查了源文件和输出文件都是用utf8编码的.
{-# LANGUAGE OverloadedStrings #-}
import Prelude hiding (writeFile)
import Data.Text
import Data.Text.IO
someText :: Text
someText = "Université"
main :: IO ()
main = do
writeFile "test.txt" someText
Run Code Online (Sandbox Code Playgroud)
运行代码后,test.txt包含:Universit .在ghci中,我得到以下内容
*Main> someText
"Universit\233"
Run Code Online (Sandbox Code Playgroud)
这已编码不正确吗?我还在https://hackage.haskell.org/package/text-1.2.2.2/docs/Data-Text.html中找到了对 的评论 ,但我仍然不知道如何纠正上面的例子.
如何在OverloadedString中使用重音并正确地将它们写入文件?
我是从这样的问题理解这个和这个,使用PRAGMA OverloadedStrings
的手段,我应该能够使用文字作为我的字符串类型。
但是,当我使用文本测试数据类型时,出现以下错误:
$ stack ghci
Prelude> :l myfile.hs
Ok, one module loaded.
*Main> Rec "asd" "m"
<interactive>:46:5: error:
• Couldn't match expected type ‘Text’ with actual type ‘[Char]’
• In the first argument of ‘Rec’, namely ‘"asd"’
In the expression: Rec "asd" "m"
In an equation for ‘it’: it = Rec "asd" "m"
<interactive>:46:11: error:
• Couldn't match expected type ‘Text’ with actual type ‘[Char]’
• In the second argument of …
Run Code Online (Sandbox Code Playgroud)