haskell.vim

おひさしぶりです。最近忙しくてHaskellを書けていないんですが、こんなものをみつけました。haskell.vimemacsにあるhaskell-modeみたいに、vimで書いていたプログラムをrunghcをつかって実行できます。

cons,car,cdr

今日は、問題2.4をといてみます。問題2.4は、lispのconsと、carを (define (cons x y) (lambda (m) (m x y))) (define (car z) (x (lambda (p q) p)))と定義されているときのcdrはどう定義されるかと問題。ということで、cons,car,cdrのこの定義で実装 cons …

長方形を表現

SICPの問題2.3。長方形を表し、周囲の長さと面積を計算する手続きを作る。 今回は、問題2.2とほぼ同じなので、以下にソースと実行結果を示します。 $cat rectangle.hs data Point = Point Integer Integer instance Show Point where show (Point x y ) = "(…

平面上の線分

今日は、SICPの問題2.2を解いてみます。問題は、線分を表現するデータ構造を作り、その線分の中間点を求めよという問題。データ構造は、x座標と、y座標を表すデータ構造を作って、ポイントを表すデータ構造を作れとなっているんだけど、そこは割愛。そのかわ…

使える文字

前回、関数の名前で定義できない文字を使いエラーを出していたので、名前に使える文字をまとめてみます。まず、関数名。 1文字目は、アルファベットの小文字か、アンダースコア。 それ以降は、アルファベットの大文字、小文字。数字。アンダースコア。シング…

有理数の計算

前回の記事へ、id:nobusunさんからツッコミをいただいて、原因判明。Haskellの変数名は、小文字英数から始めないといけなかったんですね。で、id:nobusunさんが示していただいた、ソースに変更。 $ cat yuuri.hs data Yuuri = Yu Integer Integer yAdd::Yuur…

dataが苦手

今日は、有理数の計算(足し算)をしようとして、 data Yuuri = Yu Integer Integer YAdd::Yuuri -> Yuuri -> Yuuri YAdd (Yu s1 b1 ) (Yu s2 b2) = Yu (s1*b2+s2*b1) (b1*b2)というプログラムを書いて、ghciで実行しようとしたのですが、 $ ghci yuuri.hs L…

haskellグループにはいりました

最近、忙しくて本を読むだけで、日記をかけていないのですが、haskellグループにキーワードをついかしたくて、haskellグループにはいりました。

演算子=関数?

のびのびなHaskell日記さんのところのid:muscovyduckさんのコメントより カッコを外すと問題が生じるのは、'-'(マイナス)も実は関数(二項演算子)だからです 二項演算子は関数では無く、()で囲んだときに関数になると思っていたのですが、ほんとのところ…

関数と演算子の関係

haskellでは、演算子よりも関数の方が結合が強いみたいです。 例えば、1 + 2 * 3の計算をしようとして、 (+) 1 2*3とかくと9になってしまいます。 Prelude> (+) 1 2*3 9期待した動作にしたいのなら Prelude> (+)1 $ 2 * 3 7と、書くと大丈夫みたいです

$

最近は、いそがしくてSICPの問題が解けていないんですが、ふつうのHaskellプログラミングを読んでいます。ふつけるを読んでいて、入門Haskellにもでてきていたのですが、$というものの便利さに気づきました。 入門Haskellでは、$は何もしない関数として紹介…

こんにちは

こんにちは。hasko改め、haskonです。また、よろしくおねがいします。

デジタル表示

SICPは、もともと大学の教科書のため、数学的な問題が前半多いです。 なので、たまには違うジャンルのプログラムでも書いてみます。 今回は、Best of Ruby Quizという本に出てくる問題。 Quiz2。数字の文字を引数で受け取り、電卓の様な表示を行うというプロ…

href

もう知られているかたも多いと思いますが、hrefの御紹介。 href hrefとは、コマンドラインからHaskellの関数を検索するプログラムです。作者は、来月頭、ふつけるをお出しになる青木さんです。

エディターは何をおつかいですか?

プログラム書く人には、お気に入りのエディターがあると思うのですが、みなさん何をおつかいなのでしょうか?自分の場合には、Debian上でscreenを使い、画面を分割し、vimを使いながら、別の画面でghciを使うという感じでやっております。Haskellなら、入門H…

パスカルの三角形

SICPの問題1.12は、パスカルの三角形。 パスカルの三角形は、三角形の辺上の数は全て1。三角形の内部の数はその上の2つ上の数の和という三角形。 こんなかんじ 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 ............rubycoさんやtakatohさんがやられていたやつ。 SICP…

再帰的にプロセスと反復的プロセス

問題1.11は、次の定義を再帰的プロセスと反復的プロセスで書けというもの n < 3 のとき f(n) = n n >= 3 のとき f(n) = f( n -1 ) + 2f(n -2) + 3f(n-3)では、再帰的方法の実装から saikiF n | n < 3 = n |otherwise = saikiF ( n-1 ) + 2 * (saikiF ( n -2 …

ふつうのHaskellプログラミング

id:sshiさんのところで発見。日本語のHaskellの本。ふつうのHaskellプログラミングがAmazonに登録されたようです。わたしも早速注文しました。ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門作者: 青木峰郎,山下伸夫出版社/メーカ…

アッカーマン関数

問題1.10はアッカーマン関数。また、いつもどおり、schemeで書かれている関数をHaskellに ackermann x y | y == 0 = 0 | x == 0 = 2 * y | y == 1 = 2 | otherwise = ackermann ( x -1 ) ( ackermann x ( y - 1))で、問題は次の引数のときの値は何か?だから…

haskellリングつくってみました

はてなリングを見ていて、schemeリングや、OCamlリングがあるのに、Haskellが無いのはと思い、haskellリングを作ってみました。 Haskellの勉強をしている人や、興味をもっている人の集まれる場にでもなれればと思いつくりましたので、よろしければ登録してみ…

置き換えモデル

置き換えモデルとは、どうやら出てくる関数を置き換えていって、最後に計算をするモデル。遅延評価といっていいのかな。問題1.9では、引数を1増やす手続きincと引数を1減らす手続きdecをつかって、2つの整数をたす方法を置き換えモデルを使い、4と5をたす過…

Newton法

章1.1.3にでてくるNewton法をやってみます。 Newton法とは、数xの平方根の値の予測値yがあれば、yとx/yの平均値とるという計算でさらにより路側値が得られるというものらしい。 とりあえず、本どおりに実装。 goodEnough guess x = (abs ( x - (guess * gues…

SICPの問題解いてくよ-問題1.3

次は、問題1.3。3つの引数をとり、そのうち大きい2つの引数の2乗を足したもの返す関数を定義するという問題。とりあえず、addpow :: (Num a) => a -> a -> aという、ふたつの引数の2乗を足す関数を定義。 addpow x y = (x*x) + (y*y) あとは、if文で大小関係…

SICPの問題解いてくよ

またまたまたおひさしぶりです。Haskoです。今日から、SICPこと計算機プログラムの構造と解釈の問題をHaskellで解いていこうかと思います。もともと、このネタは、日本のHaskellerなら誰もが知っているだろうnobsunさんこと山下伸夫さんがやられていたのを自…

HaskellのAPI検索

またまた相当おひさしぶりです。haskoです。今日は、HaskellのAPI検索を御紹介。Hoogleここでは、Haskellの関数などを調べることができます。 ただ、それだけではhugsなどで、:tを使い調べるのと同じですよね。ちょっと違うのは、まず関数名の一部でも検索す…

ファイルを読み込む

少し御無沙汰でした。今回はファイルを呼んで表示してみようと思います。他の言語では、基本的な機能で簡単に実現できますが、Haskellではこのような入出力などは、副作用のあつかいとなりちょっと面倒です。入出力など順序が重要になるような処理では、モナ…

今日も問題を

今日も問題をといてみます。 今日の問題はこちらちょっと考えすぎて時間がなくなってしまったので、課題1、2それぞれ片方のみやってみます。もう一方のやりかたは別の日にでも。 ソースはこちら。 hasko$ cat kougaku2.hs maxOccursList l = ( maxis l , how…

遅延評価

Haskellでは、必要なときに、必要なだけし評価しないという、なまけもの遅延評価があります。きのうn9dさんがコメントしてくださったように、遅延評価のおかげで、無限リストも作れちゃいます [1..] Prelude> take 5 [1..] [1,2,3,4,5] takeは、ひとつめの引…

演習問題をとく

Haskellの簡単な解説ばかりではあれなので、ちょっと演習問題をといてみることにします。課題は、ここの最後のほうに書かれている演習問題以下自分の実装 hasko$ cat kougaku1.hs mul m n |n == 0 = 0 |otherwise = m + mul m (n-1) maxOccurs::Int -> Int -…

カリー化

関数(+)というのは、引数ふたつをとり、引数を足したものを返す関数です。 Prelude> (+) 1 3 4 これは、「引数をひとつをもらい、もう一つの引数に、足したものを返す」関数といえます。もし、この関数が引数を一つもっている状態だったら、どのようにいえる…