haskell-jp / beginners #7

@mtkaaai has joined the channel
@wasabi has joined the channel
@tnoda78 has joined the channel
@ has joined the channel
@khibino has joined the channel
@snisimu has joined the channel
@mizuki has joined the channel
久しぶりにここに戻ってこれました、徐々にですがまたよろしくどうぞ:slightly_smiling_face:
Haskellのライブラリ関数について検索する方法はありますか? [連載QA]
以下のHoogleやStackageの検索機能で、ライブラリ(パッケージ)の関数などについて検索できます。
https://hoogle.haskell.org/
https://www.stackage.org/
試しに、 map や``Maybe` などを入力してみてください。
@ has joined the channel
@Akkey has joined the channel
@ has joined the channel
@soumunote has joined the channel
@Nagatatz has joined the channel
@Livingston has joined the channel
@Takur0 has joined the channel
@kmd has joined the channel
@ has joined the channel
よろしくお願いします!
昨日やっとこさ、brew から stack でインストールしました!
ようこそ!お好きなときに質問ください!
hask(_ _)eller
@shimama has joined the channel
@shun has joined the channel
@na4zagin3 has joined the channel
あまり beginners 向けでない質問な気がしてきたので questions に移します
@ has joined the channel
初めて質問させていただきます。

-- 【1】
main = do
    let hoge = [1,2,3] >>= \x -> return $ x + 10
    print hoge

↑はコンパイルできるのですが、

-- 【2】
main = do
    let hoge = do
      x <- [1,2,3]
      return $ x + 10
    print hoge

これだとシンタックスエラーになります。

parse error on input '<-'
Perhaps this statement should be within a 'do' block?

「<-」はdoブロックの中に記述してると思うのですが。。。。

更にわからないのが、【2】の方でも、stack runghc app/Main.hs とするとエラーにならず実行できます。
【2】をどのように修正したらエラー解消できるのでしょうか?

よろしくお願いいたします。
x <- [1, 2, 3]
return $ x + 10

のブロックを hoge よりもさらに字下げしてみてください。
runghc だと通る理由はわかりませんが、いずれにしても恐らくそれで直ります。
字下げしてコンパイル通りました。
ありがとうございます!:slightly_smiling_face:
@yutakatay has joined the channel
@coord.e has joined the channel
Reminder:
beginnersチャンネルは、新しい人がスムーズにHaskellに慣れるための質問を歓迎するチャンネルです。
Haskell-Beginners ML や IRCの#haskell-beginners や RedditのMonthly Hask Anythingのような位置づけを意図しています。

beginnersチャンネルでの回答側は、以下の左側のような応答を厳禁とする運用です。
• それはくだらない質問だ → くだらない質問など無い
• その質問は以前にもあった → 質問者はそんなこと知らない
• Google検索せよ → 検索できないから質問している
beginnersチャンネルでは、例えば以下のレベルの質問から歓迎します。
: とは何のことですか。
• タプルとは何ですか。
@HK290000 has joined the channel
@ has joined the channel
@Peacock has joined the channel
@ktahi has joined the channel
@Summit has joined the channel
お世話になっております。
またまた基本的な質問ですみません。:man-bowing:

main = do
  putStrLn "aaa"
  putStr "bbb"
  s <- getLine
  putStrLn s

これを実行すると、「aaa」が出力された後に「bbb」は出力されず入力待ち状態になります。
そして、何か入力すると初めて「bbb」と入力した文字が出力されます。
3行目をputStrLn にすると「aaa」「bbb」が出力されて、入力待ちになります。(期待した動作)

なぜこのような動作になるのでしょうか?
BufferModeという概念があって出力するタイミングを制御できるようになってます。通常はLineBufferingに設定されていて改行されるタイミングまで出力されないのでそのような挙動になっているかと!
putStr でもすぐに出力したい場合は
hSetBuffering stdout NoBuffering

のように設定してBufferingをやめれば大丈夫です!
http://hackage.haskell.org/package/base-4.14.0.0/docs/System-IO.html#t:BufferMode
早速ありがとうございます。
NoBuffering に設定することで期待通りに動きました。
ありがとうございます。:man-bowing:
@tangible.bits has joined the channel
@biacco42 has joined the channel
私の場合バッファリング自体は保ちたいのでプロンプトみたいなことをしたい時は
hFlush stdout

を途中に実行していますね
なるほど、そんなこともできるんですね!
@Noah has joined the channel
@ms has joined the channel
@siosio has joined the channel
@katsu-o has joined the channel
@HNish has joined the channel