fork download
  1. module Main where
  2.  
  3. -- トップレベルの関数名は当然ながら行頭から書く必要がある
  4. main :: IO () -- main関数は IO()型の戻り値、(※ Javaとかでの IO<Void> に似てる?(少し違うかも))
  5. main = mainA -- main関数は mainA関数であるという式になってる
  6.  
  7. -- putStrLn関数はString型の引数を取って、引数の文字列を表示して、IO()型を戻り値とする関数
  8. -- >> は二項演算子で左側の(IOモナドなどのファンクタ)の実行後の戻り値を捨てて右側の(同じ種類のファンクタ)処理を実行する
  9. -- >>演算子は左結合、>>演算子は優先順位が関数実行より低い
  10. mainA :: IO ()
  11. mainA = putStrLn "hello" >> putStrLn "world" >> putStrLn "hikky"
  12.  
  13. -- 関数名や引数や演算子との区切りの空白は余分にあっても無くても問題はない
  14. mainB ::IO ()
  15. mainB = putStrLn "hello" >>putStrLn"world">>putStrLn "hikky"
  16.  
  17. -- それぞれの式に丸括弧をつけて分かりやすくしたもの
  18. mainC :: IO ()
  19. mainC = ((putStrLn "hello") >> (putStrLn "world")) >> (putStrLn "hikky")
  20.  
  21. -- 二項演算子は丸括弧つけることで引数2つの関数となる (>>) は最初の引数が終わったら次の引数を実行みたいな?
  22. mainD :: IO ()
  23. mainD = (>>) ((>>) (putStrLn "hello") (putStrLn "world")) (putStrLn "hikky")
  24.  
  25. -- 関数名の書き始め位置を揃えることで演算子の右側を改行して書ける
  26. mainE :: IO ()
  27. mainE = putStrLn "hello" >>
  28. putStrLn "world" >>
  29. putStrLn "hikky"
  30.  
  31. -- 関数名の書き始め位置を揃えれば演算子を前に持ってくることも可能
  32. mainF :: IO ()
  33. mainF = putStrLn "hello"
  34. >> putStrLn "world"
  35. >> putStrLn "hikky"
  36.  
  37. -- 関数名の書き始め位置が揃っていればよい
  38. mainG :: IO ()
  39. mainG = putStrLn "hello" >>
  40. putStrLn "world"
  41. >> putStrLn "hikky"
  42.  
  43. -- 関数本体書き始めの位置は改行して適当なインデントつけて開始できる
  44. mainH :: IO ()
  45. mainH =
  46. putStrLn "hello"
  47. >> putStrLn "world"
  48. >> putStrLn "hikky"
  49.  
  50. -- 書き始め位置が揃っていれば大きなインデントでも空行があってもOK
  51. mainI :: IO ()
  52. mainI =
  53. putStrLn "hello"
  54.  
  55. >> putStrLn "world" >>
  56. putStrLn "hikky"
  57.  
  58. -- ファンクタでは >>演算子の代わりに do記法を代用することができる、これも関数名の書き始め位置を揃える必要がある
  59. mainJ :: IO ()
  60. mainJ = do putStrLn "hello"
  61. putStrLn "world"
  62. putStrLn "hikky"
  63.  
  64. -- 関数の書き始めはdoのすぐ後ろでなくてもよいが、書き始め位置は揃える必要がある
  65. mainK :: IO ()
  66. mainK = do
  67. putStrLn "hello"
  68. putStrLn "world"
  69. putStrLn "hikky"
  70.  
  71. -- doの書き始め位置も改行して書ける
  72. mainL :: IO ()
  73. mainL =
  74. do putStrLn "hello"
  75. putStrLn "world"
  76. putStrLn "hikky"
  77.  
  78. mainM :: IO ()
  79. mainM =
  80. do
  81. putStrLn "hello"
  82. putStrLn "world"
  83. putStrLn "hikky"
  84.  
  85. -- do記法では波括弧とセミコロンを使った書き方もできる
  86. mainN :: IO ()
  87. mainN = do { putStrLn "hello"; putStrLn "world"; putStrLn "hikky" }
  88.  
  89. -- 最後処理のはセミコロンを書くこともできるらしい
  90. mainO :: IO ()
  91. mainO = do { putStrLn "hello"; putStrLn "world"; putStrLn "hikky"; }
  92.  
  93. -- 改行しても書ける
  94. mainP :: IO ()
  95. mainP = do {
  96. putStrLn "hello";
  97. putStrLn "world";
  98. putStrLn "hikky";
  99. }
  100.  
  101. -- do記法で波括弧とセミコロンを使う場合は関数名の開始位置を揃える必要はない
  102. mainQ :: IO ()
  103. mainQ = do {
  104. putStrLn "hello";
  105. putStrLn "world" ;
  106. putStrLn "hikky"
  107. }
  108.  
  109. -- 波括弧の開始位置を改行しても書ける
  110. mainR :: IO ()
  111. mainR = do
  112. {
  113. putStrLn "hello";
  114. putStrLn "world";
  115. putStrLn "hikky";
  116. }
  117.  
  118.  
  119.  
Success #stdin #stdout 0s 8388607KB
stdin
Standard input is empty
stdout
hello
world
hikky