Haskell Language
中置演算子
サーチ…
備考
ほとんどのHaskell関数は、関数名の後に引数(接頭辞表記)が続くように呼び出されます。 (+)のような2つの引数を受け入れる関数の場合、関数の前と後に引数を与えることが時には意味があります(インフィックス)。
プレリュード
論理的
==
等価、 /=
等しくない、 <
/ <=
より小さいおよび>
/ >=
より大きい演算子。
算術演算子
数値演算子+
、 -
、 /
、あなたが期待するように大きく振る舞います。 (除算は、丸めの問題を避けるために小数点でのみ機能します - 整数除算はquot
またはdiv
行わなければなりません)。より一般的でないのは、Haskellの3つのべき乗演算子です。
^
は、任意の数値型の基底を負でない積分力に置き換えます。これは、( 高速の )反復乗算によって簡単に動作します。例えば4^5 ≡ (4*4)*(4*4)*4
^^
は正のケースでも同じですが、負の指数でも動作します。例えば3^^(-2) ≡ 1 / (2*2)
^
とは異なり、これは部分的な基底型を必要とします(つまり、4^^5 :: Int
は動作しません、4^5 :: Int
または4^^5 :: Rational
)。**
実数のべき乗を実装します。これは非常に一般的な議論では機能しますが、^
または^^
よりも計算量が高く、一般的に小さな浮動小数点エラーが発生します。2**pi ≡ exp (pi * log 2)
リスト
連結演算子は2つあります。
:
( consと発音)は、リストの前に1つの引数を付加します。この演算子は実際にはコンストラクタなので、リストのパターンマッチング (逆構造化)にも使用できます。++
はリスト全体を連結します。[1,2] ++ [3,4] ≡ 1 : 2 : [3,4] ≡ 1 : [2,3,4] ≡ [1,2,3,4]
!!
インデックス作成演算子です。
[0, 10, 20, 30, 40] !! 3 ≡ 30
索引付けリストは非効率的であることに注意してください( 配列ではO (1)ではなく、 マップでは O (log n )ではなく複雑さO ( n ))。 Haskellでは、索引付けの代わりにパターンマッチングを折り畳むことでリストを分解することが一般に好まれています。
制御フロー
$
は関数アプリケーション演算子です。f $ x ≡ f x ≡ f(x) -- disapproved style
この演算子は、ほとんどがかっこを避けるために使用されます。それはまた、厳密なバージョン
$!
持ってい$!
これは、関数を適用する前に引数を評価するよう強制します。.
関数を構成する。(f . g) x ≡ f (g x) ≡ f $ g x
>>
シーケンスモナドアクション。例:writeFile "foo.txt" "bla" >> putStrLn "Done."
最初にファイルに書き込んだ後、メッセージを画面に出力します。>>=
同じことを行いますが、最初のアクションから次のアクションに渡す引数も受け入れます。readLn >>= \x -> print (x^2)
は、ユーザが数字を入力するのを待ってから、その数字の四角形を画面に出力します。
カスタム演算子
Haskellでは、好きな中置演算子を定義できます。例えば、リスト包囲演算子を次のように定義することができます。
(>+<) :: [a] -> [a] -> [a]
env >+< l = env ++ l ++ env
GHCi> "**">+<"emphasis"
"**emphasis**"
あなたは常にそのような演算子に固定性宣言を与えるべきです。
infixr 5 >+<
( >+<
は++
および:
doと厳密にバインドされていることを意味します)。
中置演算子に関する情報の検索
インフィクスはハスケルではよくあるので、署名などを定期的に調べる必要があります。幸いにも、これは他の関数と同じくらい簡単です:
Haskellの検索エンジンHayooとHoogleは、いくつかのライブラリで定義されている他のもののように、中置演算子に使うことができます。
GHCiまたはIHaskellでは、
:i
と:t
( i nfoとt ype)ディレクティブを使用して、オペレータの基本的なプロパティを知ることができます。例えば、Prelude> :i + class Num a where (+) :: a -> a -> a ... -- Defined in ‘GHC.Num’ infixl 6 + Prelude> :i ^^ (^^) :: (Fractional a, Integral b) => a -> b -> a -- Defined in ‘GHC.Real’ infixr 8 ^^
これは、
^^
が+
よりも緊密に結びついていることを示しています。どちらも数値型を要素として取りますが、^^
は指数部が整数で底辺が小数部である必要があります。
あまり冗長ではない:t
は演算子をカッコで囲む必要があります。Prelude> :t (==) (==) :: Eq a => a -> a -> Bool