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終わり.