はてな使ったら負けだと思っている deriving Haskell このページをアンテナに追加 RSSフィード

 | 

2006-06-18

konn版Digital Root最終

| 21:22 | konn版Digital Root最終 - はてな使ったら負けだと思っている deriving Haskell を含むブックマーク はてなブックマーク - konn版Digital Root最終 - はてな使ったら負けだと思っている deriving Haskell

d:id:shinichiro_hさんに式を改良出来ると云われて小二三時間、ずーっと考えて漸くできました……何でこんな簡単なことが分からなかったんだろうorz

main=readLn>>=(\a->case a of{0->return();_->print(1+mod(a-1)9)>>main})

で、短くするのはもういいや、と。そしたら答えを乗っけてくれました。


なるほど!do式+函数マッチングの方が短かったりするわけですね……ふむふむ。shinhさん、ありがとうございました!

Digital Root改良

| 19:18 | Digital Root改良 - はてな使ったら負けだと思っている deriving Haskell を含むブックマーク はてなブックマーク - Digital Root改良 - はてな使ったら負けだと思っている deriving Haskell

main=readLn>>=(\a->case a of{0->return();_->print(a+9*(div(9-a)9))>>main})

91から74まで一気に節約!でもd:id:shinichiro_hさんは63迄削ったそうです……むーん……。

Digital Root

| 18:08 | Digital Root - はてな使ったら負けだと思っている deriving Haskell を含むブックマーク はてなブックマーク - Digital Root - はてな使ったら負けだと思っている deriving Haskell

1519 -- Digital Roots

所謂数字根の問題です。

数字根をとる、というのは、

12 -> 1 + 2 -> 3
35 -> 3 + 5 -> 8
92 -> 9 + 2 -> 11 -> 1 + 1 -> 2

という操作です。要は各位の和を、一桁になるまで計算するわけ。

一般に、数字根は9で割った剰余と同じです。

ただし、9 ≡ 0となってしまうので、9に限って云えばダメですが……。


で、問題は、0が入力されるまで数字根を表示する物です。


では、ソース

main=getLine>>=(\a->case a of{"0"->return();_->(print$(\n->n+9*(div(9-n)9))$read a)>>main})

9≡0を回避するのに奮闘しました。

直したいところ

  • もっと短く!
    • どなたか、おねがいしますorz

キーワード追加

| 09:24 | キーワード追加 - はてな使ったら負けだと思っている deriving Haskell を含むブックマーク はてなブックマーク - キーワード追加 - はてな使ったら負けだと思っている deriving Haskell

と、云うわけで、一方向モナドというキーワードを追加してみました。……いらなかったかもorz(汗;

またしてもメモ

| 06:46 | またしてもメモ - はてな使ったら負けだと思っている deriving Haskell を含むブックマーク はてなブックマーク - またしてもメモ - はてな使ったら負けだと思っている deriving Haskell

はじめてのにき(2006-06-14)とかで取り上げてもらったので、調子に乗って。

モナド補足

| 06:46 | モナド補足 - はてな使ったら負けだと思っている deriving Haskell を含むブックマーク はてなブックマーク - モナド補足 - はてな使ったら負けだと思っている deriving Haskell

肝心のモナド則が抜けていました。なのでメモメモ。

  • 新しくモナドを作るには、モナド則を満たしていないとイケナイ。
    1. return a >>= k = k a
    2. m >>= return = m
    3. m >>= (¥k -> k x >>= h) = m >>= k >>= h
  • モナド則を満たしてさえいれば、return 及び >>= (bindと呼ぶ)の実装は自由。

IOモナド詳細

| 06:46 | IOモナド詳細 - はてな使ったら負けだと思っている deriving Haskell を含むブックマーク はてなブックマーク - IOモナド詳細 - はてな使ったら負けだと思っている deriving Haskell

復習

  • 確実に順番通り処理したいときに使う
    • (≒ 順番に処理されることが保証されている)

たぶん、前回はこれっくらい。今回はもうちょっと踏み込んでみたいと思います。

詳細

  • 上のように、順番通り処理したいものを「アクション」という。つまりIOはアクション
  • ListモナドやMaybeモナドと違い、IOモナドから値を取り出すことは出来ない。
  • ↑より、IOを返さない函数はIOを一度も使わない事が保証される。
    • これは参照透明性を守る為の措置。
      • 副作用のある処理は、本体の部分と隔離される。
      • 言い換えれば、モナドの中で副作用のある処理を完結出来ると云うこと。

次回予告

次は、モナドを拡張する型クラスMonadPlusと、そもそも型クラスとは何かを勉強します。

トラックバック - http://haskell.g.hatena.ne.jp/mr_konn/20060618
 |