infixr
きほんてきなべんきょう,二日目.
fixity declaration
ナンダコレ第一弾.英語を翻訳するまでわからない.
specifies a precedence level from 0 to 9 (with 9 being the strongest; normal application is assumed to have a precedence level of 10), and left- (infixl) , right- (infixr), or non-associativity (infix)
優先レベルを0から9まで指定する(9が一番強い;普通のアプリケーション(何と訳すべき?)は優先レベルが10であると仮定する).左(infixl),右(infixr),または無連結(infix).
みたいな感じかしら.なるほど,これで例のそれが理解できるな.
lambda abstractions
出ました,lambda.mapやfoldrと併せて使うのが一般的なのかしら?
Hugs.Base> foldr (\x y -> x * 10 + y) 10 [1,2,3] 70 Hugs.Base> foldr1 (\x y -> x + y) [1..10] 55
ふむ,俄然楽しくなってまいりましたよ.
list comprehension
Hugs.Base> [x | x <- [1,2,3,4]] [1,2,3,4] Hugs.Base> [x*x | x <- [1,2,3,4]] [1,4,9,16] Hugs.Base> [x + y | x <- [1,2,3,4], y <- [2,3,4,5]] [3,4,5,6,4,5,6,7,5,6,7,8,6,7,8,9]
完全2部グラフって感じですね.
newtype
および,type.
これがNew Typeかっ・・・!おそらく,New Typeにしか見えないのであろう.
ぐぐってたら,2chの素敵レスに出会えた.
typeは既存の型の別名を作る。単なる別名であって全く同じ型。だから、例えば、
type String = [Char]
と定義されているとき、
f :: String -> Int
という関数があったら、fを[Char]型の値に適用できる。newtypeはdataと同じように、既存の型から別の型を作る。
newtype Nat = Nat Int
という定義は、
data Nat = Nat Int
という定義とほぼ同じ意味で、使いかたも同じ。
逆に言うと、newtypeはdataの制限されたバージョンといえる。
具体的には、データ構築子が一つしかなく、その唯一のデータ構築子が
引数を一つだけ取るような代数的データ型(つまり、フィールドが一つしかないレコード)を
実行効率を損なうことなく定義できるようにしたのがnewtype。従って、オーバーヘッドを気にしないなら、newtypeを使う必要はない。
逆に、特殊な場合を除いて、フィールドが一つしかないレコードは、
全てdataの代わりにnewtypeを使って定義しても良い。
なるほど.結局,使えるのならdataを使っておけば良いという事ね.
Wild-cards
_の事ね.
_ という形式のパターンはワイルドカードであり、パターン の一部が右辺で参照されないような場合に便利である。その場所を示す以外では 使われない認識子のようなものである。
http://www.sampou.org/haskell/report-j/exps.htmlより.
よし,これでSyntax終わり.