by shigemk2

当面は技術的なことしか書かない

for-comprehensions Haskell vs Scala

リスト内包表記を、ScalaとHaskellでやってみようと思ったんです。というか、Haskellのリスト内包表記をScalaで書き直せないかなと思いました。

こういうやつ。

[(x,y) | x <- [1..9], y <- [1..9], x * y == 24]
[(x+y) | x <- [1..9], y <- [1..9], x * y == 24]

この結果は、上から

[(3,8),(4,6),(6,4),(8,3)]
[11,10,10,11]

これをScalaでやってみたい。結論は、これ。

for (x <- 1 to 9; y <- 1 to 9; z = x * y; if z == 24) yield(x,y)
for (x <- 1 to 9; y <- 1 to 9; z = x * y; if z == 24) yield(x+y)

こういうことですね。直訳したらこうなったけど、List型とかSeq型とかで同じことができるかどうか試してみたいのが今後の課題です。

内包表記について、すごい合同勉強会で話した | そんなこと覚えてない

Daily scala: For-comprehensions

Haskellのletとラムダについて

違います。

A declaration of a named variable. If the let element is the child of a rule element, the variable is calculated and scoped to the current rule and context. Otherwise, the variable is calculated with the context of the instance document root. 

letは変数宣言で、子要素になっている場合は予め変数が計算されて現在のルールとコンテキストの中にスコープされる。それ以外の場合はルートのインスタンスドキュメントの中で計算される。

という訳っぽいですが、要するに、letは変数を束縛するだけで、ラムダとか関係なかったんや。

zvon.org