Haskell Language
オーバーロードされたリテラル
サーチ…
備考
整数リテラル
小数点のない数字です
例えば0
、 1
、 42
、...
Num
型のクラスの一部であるfromInteger
暗黙的に適用されるので、実際にNum a => a
型を持ちます。つまり、 Num
インスタンスである任意の型を持つことができます
分数リテラル
小数点付き数字であります
たとえば、 0.0
、 -0.1111
、...
は、 Fractional
型のクラスの一部であるfromRational
暗黙的に適用されるため、実際にはa => a
型を持ちます。つまり、 Fractional
インスタンスである任意の型を持つことができます
文字列リテラル
GHCに言語拡張OverloadedStrings
を追加した場合、 String
に対しても同じことができます。 fromString
は、 Data.String.IsString
型クラスからfromString
適用されfromString
これは、 String
をText
またはByteString
に置き換えるためによく使用されます。
リストリテラル
リストは[1, 2, 3]
リテラル構文で定義できます。 GHC 7.8以降では、これを使用して、 OverloadedLists
拡張子を持つ他のリスト様構造を定義することもできます。
デフォルトでは、 []
の型は次のとおりです。
> :t []
[] :: [t]
OverloadedLists
、次のようになります。
[] :: GHC.Exts.IsList l => l
整数
リテラルの型
Prelude> :t 1
1 :: Num a => a
注釈付きの具体的な型を選択する
ターゲットタイプが注釈付きの Num
である限り、タイプを指定できます。
Prelude> 1 :: Int
1
it :: Int
Prelude> 1 :: Double
1.0
it :: Double
Prelude> 1 :: Word
1
it :: Word
コンパイラが不平を言うならば
Prelude> 1 :: String
<interactive>:
No instance for (Num String) arising from the literal `1'
In the expression: 1 :: String
In an equation for `it': it = 1 :: String
浮動小数値
リテラルの型
Prelude> :t 1.0
1.0 :: Fractional a => a
注釈付きの具体的な型の選択
型の注釈を使用して型を指定できます。唯一の要件は、型がFractional
インスタンスを持たなければならないということです。
Prelude> 1.0 :: Double
1.0
it :: Double
Prelude> 1.0 :: Data.Ratio.Ratio Int
1 % 1
it :: GHC.Real.Ratio Int
コンパイラが不平を言うならば
Prelude> 1.0 :: Int
<interactive>:
No instance for (Fractional Int) arising from the literal `1.0'
In the expression: 1.0 :: Int
In an equation for `it': it = 1.0 :: Int
文字列
リテラルの型
拡張子がなければ、文字列リテラルの型 - つまり二重引用符間の何か - は単なる文字列、別名文字のリストです:
Prelude> :t "foo"
"foo" :: [Char]
ただし、 OverloadedStrings
拡張機能を有効にすると、文字列リテラルは数値リテラルに似た多態性になります 。
Prelude> :set -XOverloadedStrings
Prelude> :t "foo"
"foo" :: Data.String.IsString t => t
これにより、明示的な変換を必要とせずに文字列型の値を定義することができます。本質的に、 OverloadedStrings
拡張は、すべての文字列リテラルを包括的なfromString
変換関数にラップするだけです。したがって、 String
代わりにより効率的なText
要求される場合は、心配する必要はありません。
文字列リテラルの使用
{-# LANGUAGE OverloadedStrings #-}
import Data.Text (Text, pack)
import Data.ByteString (ByteString, pack)
withString :: String
withString = "Hello String"
-- The following two examples are only allowed with OverloadedStrings
withText :: Text
withText = "Hello Text" -- instead of: withText = Data.Text.pack "Hello Text"
withBS :: ByteString
withBS = "Hello ByteString" -- instead of: withBS = Data.ByteString.pack "Hello ByteString"
文字列を明示的にエンコードするために各型pack
関数を使用するのではなく、通常のString
(または[Char]
)値を構築するのと同じ方法で、 Text
およびByteString
値を構築する方法に注目してください。
OverloadedStrings
言語拡張の詳細については、拡張機能のドキュメントを参照してください。
リストリテラル
GHCのOverloadedLists拡張では、リストリテラル構文を使用してリストに似たデータ構造を構築できます。
これにより、 Data.Mapは次のようになります。
> :set -XOverloadedLists
> import qualified Data.Map as M
> M.lookup "foo" [("foo", 1), ("bar", 2)]
Just 1
これの代わりに(余分なM.fromListの使用に注意してください):
> import Data.Map as M
> M.lookup "foo" (M.fromList [("foo", 1), ("bar", 2)])
Just 1