Haskell隐式转换

时间:2018-10-10 15:20:29

标签: haskell type-conversion

您好,我一直想使用Data.Text.intercalate,从Hackage开始,我不明白为什么该方法具有以下签名:

intercalate :: Text -> [Text] -> Text

为什么可以正常工作

T.intercalate "NI!" ["We", "seek", "the", "Holy", "Grail"]
"WeNI!seekNI!theNI!HolyNI!Grail" 

您不应该在列表的每个元素之前应用Data.Text.pack吗?
来源:http://hackage.haskell.org/package/text-1.2.3.1/docs/Data-Text.html
 
就我而言,我想打包以下内容:

输入"{"mytext"}" #mytext::Text
我正在使用:
Prelude.intercalate (Data.Text.pack ",") [pack "{",mytext, pack "}"]

(pack "{") ++ mytext++ pack "}")
有人可以解释一下Data.Text为什么公开与Data.List相同的方法(在我们的情况下为intercalate),以及它如何在CharText吗?

1 个答案:

答案 0 :(得分:9)

您可能启用了-XOverloadedStrings(或使用文件顶部的{-# LANGUAGE OverloadedStrings #-}启用了此功能)。

因此,这意味着字符串 literals (不是字符串变量,只有文字)可以由任何IsString类型解释。

TextIsString类型。因此,这意味着隐式地在字符串 literals 周围使用pack(再次使用文字,而不是普通变量)。

数字文字也会发生类似的情况:数字文字可以是任何Num类型。根据您在数字文字上调用的函数,Haskell可以得出确切的类型,从而相应地“解释”文字。例如,如果您编写atan2 1 2,则12应该被解释为RealFloat类型,而对于quot 1 21和{ {1}}被解释为“整数”类型。