Problem 3
今回はProblem 3を…
素因数分解の問題ですね。
どこかでunfoldrを使った素因数分解を見た記憶があったので再現(?)してみました。
import Data.List fac x = case [y | y <- [2..x], x `mod` y == 0] of [] -> Nothing [t] -> Just (t, 0) (t:_) -> Just (t, x `div` t) main = print . maximum . unfoldr fac $ 600851475143
こんな感じだったかな?
今までunfoldrなんて使ってなかったのでとても勉強になりました。
それにしてもunfoldrって便利ですね。
Problem 1
はじめに
最近はネタがなく一ヶ月以上更新してなかったのでProject EulerをHaskellでやっていこうかと思います。
本題
今回はProblem 1なのでここに書くほどのものでもないですが…
main = print . sum $ [x | x <- [1..999], x `rem` 3 == 0 || x `rem` 5 == 0]
こんな感じに書いてみました。
未満ってその数を含まないんだよね?
まあ一問目は簡単でしたね。
おわりに
これからなるべく更新する予定なのでお願いします。(忘れなければ…
haskellでGUIを一行で
HaskellでGUIこの記事のプログラム(簡単にしたもの)をdo記法を使わずに書いてみたいと思います。
import Graphics.UI.Gtk;main = initGUI >> windowNew >>= \window -> onDestroy window mainQuit >> widgetShowAll window >> mainGUI
強引に一行にしました。
なんかあんまり美しくないですね。
import Graphics.UI.Gtk main = initGUI >> windowNew >>= \window -> onDestroy window mainQuit >> widgetShowAll window >> mainGUI
まだこっちのほうが綺麗ですね。
最近は練習で一行で書いたりしてるけど無理に一行で書かないほうが簡単に書けますね。
まあ自分用のメモ程度に書いたのでこのくらいですね。
誰かネタをください
追記
前の記事と同じものをやろうと思ったら
import Graphics.UI.Gtk main = initGUI >> windowNew >>= \window -> set window [windowTitle := "Hello",windowDefaultWidth := 200,windowDefaultHeight := 50] >> labelNew Nothing >>= \label -> labelSetText label "Hello, World!" >> containerAdd window label >> onDestroy window mainQuit >> widgetShowAll window >> mainGUI
こうなります。
やりたいことを順番に書けばできるって、haskell素敵ですね
数値型についてのメモ
haskellで失敗したので自分用メモを。
簡単な計算するだけだったのですが……
調子に乗って
test :: Int -> Int
こんな型宣言をしたので大きな数の計算ができなくて
ただの凡ミスです(泣)
-- (1) test :: Integer -> Integer -- (2) test :: (Num a) => a -> a
このどちらかにすればいいみたい(?) ←結局は同じ形になりますが…
(1)は普通の方法です。Integerは精度無制限なので大丈夫ですね
(2)の方を使うと小数も扱えるので便利だけど、整数しか計算できないときにエラーが出ないので使えないのかな。(調査の必要あり)
Num型はどんな数値でも(?)受け付けるので使うときには注意が必要かと思いました。
pythonだと型とかあまり意識してなかったので注意ですね。