水面下の夢

競プロやイラストに興味があります.メインブログがここ.ソシャゲの話はこっち(http://ameblo.jp/0n0-yumechi/).ブログアイコンはYaQ(@8_9_00)さんから.

haskell勉強し始めました笑(2015/12/27〜)

なんで始めたのかって言うとそこまで深い理由はないのですが,関数型プログラミング言語の一つくらい素養として知っておいて,関数型言語で何が実現できるのか,何を考え方として取り入れなければいけないのか,ということを少し真剣に考えてみようかなと思ったからです.



とりあえず,この本で勉強中.


関数プログラミング入門 ―Haskellで学ぶ原理と技法―

関数プログラミング入門 ―Haskellで学ぶ原理と技法―


基本的に理論中心で,haskellライクの数式は並んでいるものの,プログラム書く機会はあまりない模様.


私はプログラムが書きたいんだよなあ.というわけで,実際に例題をプログラムに落としてみたりしています.


2.1.3の例題の三角形の形を判定する(引数は非減少順に並んでいると想定する)プログラムを少し書いてみました.


gist.github.com


dataっていうデータ型を定義して,どう使うのかわからず,四苦八苦していました.


deriving (Show, Enum) っていうものをつけて,ちょっと工夫するとアクセスできるみたいですね.


それに気がつくまで,どう出力すればよいのか,本当に悩んでいました.


この辺りが参考になりました.


Haskell 代数的データ型 超入門 - Qiita

追記


練習問題2.1.4, 2.1.5を読んでいたら,順序によらず三角形の形を判断しなければいけないので,3つの数をソートしてやる必要が出てきました.


そこでソートの方法についてしらべ,数値→リスト→数値に変換するためにリストの使い方,リストからの取り出し方も少し調べました.import Data.Listを使わないとソートできないのね,降順,昇順の操作はreverseを使えば簡単にできましたが….


この辺りが参考になりました.


モジュール - ウォークスルー Haskell


haskell-cheat-sheet.md · GitHub

Haskell-プログラムの記述について CapmNetwork

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(追記ここまで)



それとうるう年判定するプログラムも書いてみました(2.1.2の例題)


うるう年かどうかを判定するプログラム(例題2.1.2を実際にプログラムにした) · GitHub


ここではhaskellの論理演算子と,繰り返しの適応に苦戦しました.


他のプログラム言語では"!="となる一致しないことを表す演算子haskellの世界では"/="になるんですね.


それとfor文,while文がなく,再帰を使って表現する世界のようなので,どうやって繰り返し数字を適応するのかが,さっぱりわかりませんでした.


ここではmap関数を用いて繰り返しっぽいものを表現しています(正確には繰り返しじゃないですよねこれ)


あと,ガードとかotherwise(他プログラミング言語で言うcase文のdefaultみたいな)っていうのもなかなかなれないと大変そうですね^^; 中置記法にする場合は,バッククオートで囲むのも忘れがちです^^;


この辺りの記事が参考になりました.

お気楽 Haskell プログラミング入門

Haskellの演算子について纏めてみた - 開発やプログラミングや家族や思考

高階関数 - ウォークスルー Haskell



それとちょっと苦戦したのはhaskellのプログラムの実行方法.コンパイルする方法しか知らなかったのですが,実はスクリプト言語のように実行する方法もあったのでした.これです.*1

runghc [filename].hs

[filename]には作ったファイル名を入れてくださいね,helloworld.hsとか.


この記事で知りました.

GHCによるHaskellの3つの実行方法とHello World - Cutting-Edge Programming



さて,久々に新しいプログラミング言語を触っているので,なんか大変ですけど,強い型付けって云うのもこれはこれで面白いですし,使いこなしてみたいですね.(というか,型がクシャクシャすぎて処理がもはや意味不明の某言語とかで役に立たないかなーと少し思っております).


haskellで何か作ろうという考えはいまのところありませんが,関数型プログラミング技法を学んで,普段のコーディングに活かしていけたら楽しそうですね.

*1: ただし速度はそんなに早くありません