Haskell

あまりのつまらなさに

リアルワールドハスケルを持ち込む。

やはり、リスト内包表記

これがある言語はエレガントですね。 Rubyのブロックもいいけど。

論理型/関数型言語Curryとな

Haskellがベースらしいが、Windows向けのディストリビューションがナイ!

多分

継続とモナド連鎖。 計算式ビルダとマクロ。 は同じ概念?

会社の先輩がHaskellを始めた。

オーム社のHaskellプログラミング。 ちょっと悩んでいたようだけど、スグ使いこなしそうな予感。

ErlangとHaskellの統合

文法的にとても似てるので可能ではなかろうか?

ErlangとHaskell

文法的にはかなり似てる。 アーランにはアクターがあり、ハスケルにはモナドがある? しかしアーランでもモナド的なモノは定義できるんでなかろうか? アーランの方がスゴイのかな? 追記: いやまて、Haskellにはアクションがあるなぁ。

f-1(インバース)を自然に解釈してくれる処理系

ある関数を定義すると、その逆関数を定義しなくても ナチュラルに解釈・実装してくれる処理系はあるのだろうか? 例えば double x = x * 2と定義したら double-1 x = x / 2を定義しなくても使えるみたいな。業務システムでは必要ないと思うけど・・・

ソート処理は関数なのか?

関数が、与えられたパラメタのみに依存し、値を返す変換器ならば単純に数を2倍する関数 double x = x + x は数学的に y = f(x) = x + xという数式で表されて、自然な感じがする。次に、クイックソートを考えると qsort [] = [] qsort (x:xs) = qsort smalle…

関数型に関する紹介資料を作成するかも

社内の部門向けに資料を作成するかも。・関数型の特徴 ・実例 ・MapReduceなどのトレンド等を紹介できればと考えています。

新刊

最近、気になってる本を2冊 ・関数プログラミングの楽しみ Haskellの本 プログラミングHaskellと同様にオーム社 しかし、プログラミングHaskellのParserの章かMonadの章で そのまま打ち込んでも動かないサンプルがあった。 よく見ると脚注に「動きませんよ…

関数型言語の特徴 まとめ

Javaのコードを Scala、Clojure、Lisp、Haskellで書いてみたけど、 基本的には、リスト作成の部分で差があるけど リストを操作する部分では、map関数やreduceもしくはfoldをつかって Javaで1メソッドとしていた部分を1行の関数呼び出しに 節約できた。書い…

関数型言語の特徴 Haskell版

data SomeBean = SomeBean { firstName :: String, lastName :: String, age :: Int } deriving (Show) bean1 = SomeBean { firstName = "hiroshi", lastName = "tanaka", age = 30 } bean2 = SomeBean { firstName = "taro", lastName = "sato", age = 40 }…

プログラミングHaskellをClojureで解く P.74 map

Prelude> map (+1) [1,3,5,7] [2,4,6,8] user=> (map #(+ 1 %) [1 3 5 7]) (2 4 6 8)

プログラミングHaskellをClojureで解く P.45 リスト内包表記

Haskell Prelude> [ x^2 | x <- [1..5]] [1,4,9,16,25] Clojure user=> (for [x (range 1 6)] (* x x)) (1 4 9 16 25) スーパーpre記法のシンタックスハイライトを使ってみた。 Prelude> [ (x, y) | x <- [1,2,3], y <- [4,5]] [(1,4),(1,5),(2,4),(2,5),(3,…

プログラミングHaskellをClojureで解く P.43 halve

Haskell halve :: [a] -> ([a], [a]) halve xs = (take (length xs `div` 2) xs, drop (length xs `div` 2) xs) *Main> :l halve.hs [1 of 1] Compiling Main ( halve.hs, interpreted ) Ok, modules loaded: Main. *Main> halve [1,2,3,4,5,6] ([1,2,3],[4,…

プログラミングHaskellをClojureで解く P.12 last

Haskell last_ xs = head (reverse xs) *Main> :l last.hs [1 of 1] Compiling Main ( last.hs, interpreted ) Ok, modules loaded: Main. *Main> last_ [1,2,3,4,5] 5Clojure user=> (last [1 2 3 4 5]) 5 user=> (first (reverse [1 2 3 4 5])) 5Clojureの…

プログラミングHaskellをClojureで解く P.12

シーケンスのサイズってどうやって取得するんだろう?? Haskell Prelude> head [1,2,3,4,5] 1 Clojure user=> (first [1 2 3 4 5]) 1Haskell Prelude> tail [1,2,3,4,5] [2,3,4,5] Clojure user=> (rest [1 2 3 4 5]) (2 3 4 5)Haskell Prelude> [1,2,3,4,5…

プログラミングHaskellをClojureで解く P.10 product

Haskell product_ [] = 1 product_ (x:xs) = x * product xs *Main> :l product.hs [1 of 1] Compiling Main ( product.hs, interpreted ) Ok, modules loaded: Main. *Main> product [2, 3, 4] 24Clojure (defn product [array] (if (empty? array) 1 (* (f…

qsortできた

user=> (defn qsort [array] (let [value (first array) smaller (for [v array :when (<= v value)] v) larger (for [v array :when (> v value)] v)] (when-not (empty? array) (into (conj (qsort larger) value ) (reverse (qsort (rest smaller)))) ) )…

プログラミングHaskellをClojureで解く P.3 P.7 sum

Haskell 標準のsumがあるので *Main> sum [1..4] 10 *Main> sum [1..10] 55P.7をそのまま写経する。 名前が衝突するのでsum_で sum_ [] = 0 sum_ (x:xs) = x + sum xs Prelude> :l sum.hs [1 of 1] Compiling Main ( sum.hs, interpreted ) Ok, modules load…

プログラミングHaskellをClojureで解く P.1 double

プログラミングHaskellをScalaで解いてる人がいるので、 Haskellの復習を兼ねてClojureで解いてみる。P.1 double Haskell double x = x + xPrelude> double x = x + x <interactive>:1:9: parse error on input `=' Prelude> double x = x + xあはーん。 エラー発生。 フ</interactive>…

restかな?

にしてもリストがでかくなるとスタックオーバーしそうだ。 user=> (defn qsort [array] (let [value (first array) smaller (for [v array :when (<= v value)] v) larger (for [v array :when (> v value)] v)] (println (rest smaller)) (println value) (…

プログラミングHaskellをClojureで解く P.8 qsort

Haskell qsort [] = [] qsort (x:xs) = qsort smaller ++ [x] ++ qsort larger where smaller = [a | a <- xs, a <= x] larger = [b | b <- xs, b > x] Prelude> :l qsort.hs [1 of 1] Compiling Main ( qsort.hs, interpreted ) Ok, modules loaded: Main. …

L8.unconsとL.unconsの動作の違い

*Main> L8.uncons (L8.pack "foo") Loading package bytestring-0.9.1.4 ... linking ... done. Just ('f',Chunk "oo" Empty) *Main> L.uncons (L8.pack "foo") Just (102,Chunk "oo" Empty) *Main>

10.4.3 より面白い構文解析器

parseByte関数 これは最初の1文字だけを解析して ASCIIコードで返す。 parse関数の第一引数として使う。 *Main> let before = ParseState(L8.pack "foo") 0 *Main> let after = modifyOffset before 3 *Main> before ParseState {string = Chunk "foo" Empt…

10.4.1 恒等構文解析器

parse (identity 1) undefinedを読んでみる。 まず、 *Main> :type parse parse :: Parse a -> L8.ByteString -> Either String a *Main>parse関数はParse aとL8.ByteStringを受け取りEither String a を返す関数である。 次に、 *Main> :type identity iden…

Real World Haskellの進み具合

9章ぐらいから読む速度がすごく遅くなって来たorz というのも、基本的な考えがわかってるだけでは (これも充分怪しいけど・・・) 読んで理解することができなくなって来ているので 実際にコードを書いて、:tとかで確認しながらの勉強になってる。 8章ま…

Real World Haskell 10.4.3 より面白い構文解析器(これはメモです)

import qualified Data.ByteString.Lazy.Char8 as L8 import Data.Word modifyOffset :: ParseState -> Int64 -> ParseState modifyOffset initState newOffset = initState { offset = newOffset } parseByte :: Parse Word8 parseByte = getState ==> \ini…

中間報告

Haskellは難しいです。 Haskellをマスターして Haskellicなコードを書くのは、神クラスのデベロッパーです。