Haskell

モナド構文糖

モナドが便利で、モナド構文糖が便利だってことには特に異論がないんだけど、 それならそれでHaskellのdo-returnみたいに逐次実行に似せるほうが絶対にいいと思う。 そうでなければ、もっとこう、bindとかunitとかそういう語彙を前面に出してほしい。 つまり…

遅延評価とfoldr/foldl

Haskellの遅延評価のイメージは「まず式を立てる(サンクを作る)けど、値の評価はまた別の話」。 foldrは foldr f acc [x0, x1, x2, x3, ... , xn] = x0 `f` (foldr f acc [x1, x2, x3, ... , xn]) = x0 `f` (x1 `f` (x2 `f` (x3 `f` ... `f` (xn `f` acc) …

OKWaveの質問

Graham Hutton著「プログラミングHaskell」の第8章関数型パーサーを勉強しています。 本の中にあるソースコードではdo記法などが使えないため、動きません。 サポートページにプログラムがあります。そのプログラムの意味がよくわかりません。 教えていただ…

関数適用と関数合成

では、こんな関数があったとき replicate 2 (product (map (*3) (zipWith max [1,2] [4,5]))) 関数合成をして、まっとうな記述をするとこう書けるらしい。 replicate 2 . product . map (*3) $ zipWith max [1,2] [4,5] Haskell学びたてのころは、どういう発…

Haskellのポイントフリー

読みにくいからやめてほしい。 自己満足以外に実用的な意味があるのかどうか。 そもそも、セクションとかflipとかを使いまくらないと実現できないわけでしょう? unlambdaやlazy kは実用言語じゃないでしょう?

HaskellとF#の適当な比較

サンク メモ

Haskellで書いてもしょうがないのであとでF#にするか? 正格評価の言語だとunitがアウトだなきっと。最初から() -> a で渡してやらないと。 newtype Thunk a = T (() -> a) unit :: a -> Thunk a unit x = T (\y -> x) eval :: Thunk a -> a eval (T x) = x …

参考になった

http://d.hatena.ne.jp/notogawa/20121201/1354389374 hoogleの使い方(型から引く)という技もそうだが、トップダウン思考が参考になった。

モナド版ParserをApplicative Parserにしてみる

Applicativeの勉強のため、プログラミングHaskellのパーサーをApplicativeに変更してみた。 書いていると、ApplicativeというよりはAlternativeにするべきと分かったので、そのように実装した。 import Data.Char import Control.Applicative newtype Parser…

C#/Java頭の私がHaskellに戸惑ったところ(ただしモナドを除く)

いろいろあるが、以下の3つかな。 値コンストラクタは型ではない たとえば、CircleとRectangleを含むShapeという独自のデータ型を定義するとする。Circleは半径を、Rectangleは幅と高さを持つとする。そういうデータ型はHaskellだとこんな感じで定義する。 d…

Haskell脳

flip constとconst idが等価だってことは、Haskellになじんでくると素直に思い浮かんでくるものなのか? 命令型でいうと、forがwhileで書ける、みたいな感じで、プログラマの常識なのか? もしそうなら、まだぜんぜんHaskell脳になってないな、おれの頭。 や…

FunctorとApplicativeとMonad

ファクンタ⇒アプリカティブ⇒モナドの順で力強くなってることを、リストを例に考えてみる。 ファンクタ1つのリストに対して、1引数の変換(map)ができる。 アプリカティブ複数のリストに対して直積をとって、多引数の変換ができる。 モナド変換だけじゃなく、…

Haskell vs F# リベンジ

昨日のHaskellコードをF#に移植してみた。 type Point = {X: int; Y: int;} static member ( + ) (p: Point, q: Point) = {X = p.X + q.X; Y = p.Y + q.Y;} static member ( - ) (p: Point, q: Point) = {X = p.X - q.X; Y = p.Y - q.Y;} type Pair = {Front…

会社のプログラミングコンテスト

10年ぐらい前の問題をHaskellで解いてみた。 問題は、「8×8ますの正方形のパネルを同じ形に2分割する分け方はいくつあるか」というもの。 ↓のコードは回転同型は考慮しているが鏡像同型は考慮してない。でもすっきりと書けたんじゃないかな。 (追記)Node型…

Re: Haskell vs F#

http://d.hatena.ne.jp/rst76/20120204/1328362118 F#の環境を作るのが面倒という声も上がっているけど、 オンラインでやりゃいいじゃない。パンがなければお菓子を食べればいいじゃない。 というか、Linux/Mac/Solarisな人ならmonoを入れれ。 http://www.go…