haskell

emacs22でhaskell-mode2.4を動かす

先日の emacsのhaskellモードでC-cC-lで自動的にmainを評価し、更にカーソルを編集バッファにとどまらせる - 計算機と戯れる日々 はhaskell-mode-2.3でやったみたいだ。 どうも最新は2.4になってる。 http://www.iro.umontreal.ca/~monnier/elisp/#haskell-m…

haskellでpermutationを作ってみる

正確には順列じゃなくて nPmのn=mのときだけ。 import List main=print $ permutation [1..3] permutation (a:[]) = [[a]] permutation a = concat $ zipWith (\x y->map (x:) (permutation (delete x y))) a $ repeat a結果 *Main> main [[1,2,3],[1,3,2],[…

GHCiやめた記念:qsortをmainでやってみる

import List main=print a a=qsort [3,2,1,4,1,2] qsort [] = [] --qsort (x:xs) = qsort [y|y<-xs,y<x] ++ [x] ++ qsort [y|y<-xs,y>=x] qsort (x:xs) = qsort l ++ [x] ++ qsort r where (l,r)=partition (< x) xs結果 *Main> main [1,1,2,2,3,4] *Main> emacs入れて良かった。</x]>

なんかよくわからんからあとで復習する。

n番目の要素とそれ以外のリストからなるタプルを生成する。 Prelude> let (l,a:r)=splitAt 1 [1..4] in (a,l++r) (2,[1,3,4]) Prelude> let (l,a:r)=splitAt 2 [1..4] in (a,l++r) (3,[1,2,4]) Prelude> let (l,a:r)=splitAt 3 [1..4] in (a,l++r) (4,[1,2,3…

emacsのhaskellモードでC-cC-lで自動的にmainを評価し、更にカーソルを編集バッファにとどまらせる

追記 2008/02/21 14:00:28: このページでのhaskellmodeはバージョンが旧いので emacs22でhaskell-mode2.4を動かす - 計算機と戯れる日々を参照のことemacsのhaskell-modeの2.3を導入した。 schemeモードのC-cC-lではカレントファイルをロードした後、評価し…

haskellで漸化式

等差数列 初項3項差4の等差数列 Prelude> let a=3:(map (+ 4) a) Prelude> take 10 a [3,7,11,15,19,23,27,31,35,39] 等比数列 初項3項比4の等比数列 Prelude> let a=3:(map (* 4) a) Prelude> take 10 a [3,12,48,192,768,3072,12288,49152,196608,786432] …

haskellって多重代入できたんだ(笑

初めて気がついた let句 where句では 以下のような定義が可能。 タプルの場合、schemeの多値を扱うreceive句にそっくり Prelude> let a:b = [1,2,3] Prelude> a 1 Prelude> b [2,3] Prelude> let (l,r)=splitAt 2 [1,2,3,4] Prelude> l [1,2] Prelude> r [3,…

(続)haskellでバブルソート

タプルの利用により少し先に進んだ。 Prelude> let bsort [] = []; bsort x = (\x->fst x ++ (bsort $ snd x)) $ splitAt 1 $ foldr (\x y->if y==[] then [x] else if x < (head y) then x:y else (head y):x:(tail y)) [] x Prelude> bsort [3,5,2,4,1] [1…

haskellでバブルソート

こ、こんなに辛いとは思いもよらなかった。 しかし、内部で利用している関数bを2回呼び出しているあたりが今の限界。しかも関数bはちょっと変則的に作ってるしな。リスト構造は後ろからたどるのが辛い。foldrかなぁ。 この点で変数って素晴らしいとおもって…

Haskellの表記をGaucheと併せて比べてみる。

まずは、shiroさんに教えてもらったGaucheのコード*1 (use util.match) (define qsort (match-lambda (()()) ((x . xs) (receive (l r) (partition (cut < <> x) xs) `(,@(qsort l) ,x ,@(qsort r))))))次になるべく似せたHaskellのコード import List qsort…

ghci中でモジュールをインポートする

いつも忘れてしまうのでメモする importをghci中で用いるには :mをつかう。 Prelude> :m List Prelude List> あと hugsでは whereだが、 ghciではlet

GHCでUNIQ

一つ違いzipによるuniq まあ、昨日のscheme版の焼き直し。haskellの方が読みやすいが数字しかuniq出来ない あと、メタな記号が入れられないので(今回は1000でごまかした)いまいち。 Prelude> (\x->reverse $ drop 1 $ reverse $fst $ unzip $ filter (\x->…

モナドの>>=がちょっとだけわかったかも

コマンドラインのパイプ"|"と同じになるように処理がつなげるように定義してあるのが各モナドの">>="かな?という感覚を持った。 というか、rubyの"."と同じじゃないか!! やっと以下のURLのイメージが理解できた。 http://www.sampou.org/haskell/a-a-mona…

モナドは相変わらずわからないががんばってるよ。

以下の3つは全て同じ意味。a.txtをb.txtにコピーし"OK"を出力 $ runghc -e 'main=readFile "a.txt">>= \s ->writeFile "b.txt" s>>putStrLn "OK"' OK $ runghc -e 'main=readFile "a.txt">>= writeFile "b.txt">>putStrLn "OK"' OK $ runghc -e 'main=do{s<…

ghcで漢字を扱う。

ソースコード中には漢字が書けない。(コメントを除く) $ echo -e "abc\n漢字十を表示する\n123" > a.txt $ runghc -e 'main=do{c<-readFile "a.txt";putStr c}' abc 漢字十を表示する 123 $ runghc -e 'main=do{c<-readFile "a.txt";putStrLn$concat$lines…

日本語の扱い。

がーん。ghcって以下ができないんだ。 Hugs> putStrLn['ぁ'..'ん'] ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん台無しだ。…

zipN,zipWithN (N>3)

ListモジュールをインポートすればzipNは9まで使えるようになる。 以下は、FizzBuzzを無限リストとzipWith4で片付けた例。 無限リストの停止条件を最後に持ってきているのと文字列加工を一箇所に集約できている点がhaskellらしさだな。 Prelude> :module Lis…

haskellに惚れた一瞬

haskellによるFizzBuzz別解。zipWith3とcycleで気持ちよく組めました。 putStr$concat$zipWith3 (\x y z->(if x++y=="" then show z else x++y)++"\n") (cycle ["","","Fizz"] )(cycle ["","","","","Buzz"])[1..100] 嫌なんだけど mapM_の方が短くなるな。…

runghc -eを直したので以下でいける。 $ runghc -e 'import System;main=getArgs>>=mapM_ catFile;catFile a=do{c<-readFile a;mapM_ putStrLn $ zipWith (\x y->(reverse$take 4$reverse(" "++(show x)))++" "++y) [1..] (lines c)}' a.txt 1 aaa 2 bbb 3 …

後ろから取ってくるtake

やっぱreverse$take$reverseの方が短いしわかりやすい。 しかし、なんてださいんだ>if ガードかパターンマッチで書くべきなんだろうが一行でかけない。 Prelude> let takelst n s=if n==0 then [] else (if n==1 then [] else takelst(n-1)$init s)++[last …

0拡張

今のところこれぐらいしかわからない。 javascriptでいうところの substr(-4)に該当するtakeがあればいいのだが。 Prelude> map (\x->reverse$take 4$reverse("0000"++(show x))) [8..12] ["0008","0009","0010","0011","0012"] 追記:平成19年07月03日 prin…

だめ、俺の限界を超えてる。モナド来た しかも引数0の時動かない。 $ runghc -e 'import System;main=do{a<-getArgs;mapM (\x->getFile x) a;return ()};getFile x=do{c<-readFile x;putStr c} ' a.txt b.txt foo bar buzz foo2 bar2 buzz2 もう少し読みや…

各コマンドの-eオプションをそろえる

.bashrcに以下を書く function gosh(){ if [ $# -ge 1 ] && [ $1 == '-e' ]; then echo "$2">$$.scm;shift 2;`which gosh` $$.scm "$@";rm $$.scm; else rlwrap `which gosh` "$@";fi } function runghc(){ if [ $# -ge 1 ] && [ $1 == '-e' ]; then echo "$…

runghcに-eオプションを無理矢理付ける

上のエントリとまったく同じノリ。なので引数も同じ問題点を抱えてる。 $ function runghci { if [ $# -ge 1 ] && [ $1 == '-e' ]; then echo $2>$$.hs;shift;shift;runghc $$.hs $*;rm $$.hs;else runghc $@;fi; } $ runghci -e 'import System;main=do{a<-…

くー、runghcの-eオプションだとmainの省略パターンみたいだ。せめて-で標準入力からとってくれるとうれしいのだが $ echo 'import System;main=do{a<-getArgs;putStrLn $ unwords a}'>a;runghc a "aaa bbb" ccc;rm a aaa bbb ccc #!/usr/bin/runghc import …

リスト操作

まだまだいろいろありそうだけど取り合えずはここまで。 Hugs.Base> :l List List> partition (/=',') "12,3,4" ("1234",",,") List> takeWhile (/=',') "12,12,22" "12" List> sort [2,1,4,3] [1,2,3,4] List> nub [2,1,4,3,2] [2,1,4,3] List> group $ sor…

サンク

自分自身まだまだそんなレベルじゃないんだが、マルチコアにおける密結合における論文じゃないのかな? この論文では、割と楽観的な前提に基づいて「そもそもサンクに対して厳密な排他制御は不要」と言っている。 サンクって何だろうと思い調べてみた。 遅延…

タプル型

fst snd は 2要素のタプルの時のみに働く関数。 Hugs.Base> fst (1,'a') 1 Hugs.Base> snd (1,'a') 'a' Hugs.Base> snd (1,'a',3) ERROR - Type error in application *** Expression : snd (1,'a',3) *** Term : (1,'a',3) *** Type : (c,Char,d) *** Does …

unique

uniq [1,2,3,2,4,5,4] where uniq (x:xs)|elem x xs=uniq $ filter (/=x) xs|otherwise=x:(uniq xs); uniq []=[]内包表記で考え直しているときに本当のuniqは uniq [1,2,3,2,4,5,4] where uniq (x:xs) = x:(uniq [y|y<-xs,y/=x]) ; uniq [] = []と思ったが、…

基礎からやり直し

http://web.archive.org/web/20030818083642/www.teu.ac.jp/kougi/koshida/Prog6/text02.html より >import Char 課題1 3個の整数が全て異なる時にTrueを,そうでないときにはFalseを返す関数 threeDifferent :: Int -> Int -> Int -> Bool を定義せよ(君の…