Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@YukiMiyatake

ズンドコキヨシ with はじめてのHaskell

ズンドコキヨシとは?

流行ってるらしい
http://qiita.com/shunsugai@github/items/971a15461de29563bf90

ランダムで ズン と ドコ を出力し
ズン4回以上のあとドコが来たら キ・ヨ・シ! を出力して終了
という勉強にはもってこいの教材

Haskellを勉強しながら書いてみる

Haskell なくね?
ってことで、HaskellをWebで勉強しながら 書いてみる

モナドってなにーーーー アクションってなにーーーー 

zundoko
import System.IO
import System.Random

zun:: Int -> [Int] -> String
zun cnt (0:ran) = "ズン" ++ zun (cnt+1) ran
zun cnt (r:ran)
  | cnt > 3 = "ドコキ・ヨ・シ!"
  | otherwise = "ドコ" ++ zun 0 ran



main :: IO()
main = do
  gen <- getStdGen
  let ran = randomRs(0,1) gen::[Int]
  putStrLn $ zun 0 ran

Haskellを勉強しつつ書いているので、改善とか 他のやり方とか教えて下さい!!

ポイント

初心者らしく背伸びせず、わかりやすい&関数型を意識したコードを書いたつもりです

関数型を意識し、無限リストと再帰関数で実現
ラムダ等使ってもよかったかもしれないけど 読みやすさ優先です

是非 色々なHaskellコードを見せてくれるとありがたい・・

初心者がつまったところ

ほんと初心者で 文法に苦労した・・

まず パターンマッチとガードのあたりが、細かく理解できず混同させてた
パターンマッチっていうより、同じ名前の特殊化された関数を作っているんですね・・

関数呼び出しは ()や, を使わないのだけど、ついくせで 書いてしまったり

最大に困ったのは
putStrLn $ zun 0 ran
この部分を
putStrLn zun 0 ran
って書いてエラーが出て エラーをみると putStrLnに3つの引数を送っていて、かといって
putStrLn (zun 0 ran)
と書くと怒られる
こういうときに $ を使うみたいですね

あとは printだと文字化けしました

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
6
Help us understand the problem. What are the problem?