haskell-jp / beginners #7

@mtkaaai has joined the channel
@wasabi.nvim.st has joined the channel
@tn78adsl has joined the channel
@ktchg752 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` などを入力してみてください。
@dex10619 has joined the channel
@akkey52417 has joined the channel
@tamba8525 has joined the channel
@soumunote has joined the channel
@nagata.hbdc has joined the channel
@rydeen2045 has joined the channel
@yt1997kt has joined the channel
@masahito.keio has joined the channel
@pometarou93 has joined the channel
よろしくお願いします!
昨日やっとこさ、brew から stack でインストールしました!
ようこそ!お好きなときに質問ください!
hask(_ _)eller
@sennenn9 has joined the channel
@ohsofty has joined the channel
@na4zagin3 has joined the channel
あまり beginners 向けでない質問な気がしてきたので questions に移します
@tomoya0229 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
@ogahiro0720 has joined the channel
Reminder:
beginnersチャンネルは、新しい人がスムーズにHaskellに慣れるための質問を歓迎するチャンネルです。
Haskell-Beginners ML や IRCの#haskell-beginners や RedditのMonthly Hask Anythingのような位置づけを意図しています。

beginnersチャンネルでの回答側は、以下の左側のような応答を厳禁とする運用です。
• それはくだらない質問だ → くだらない質問など無い
• その質問は以前にもあった → 質問者はそんなこと知らない
• Google検索せよ → 検索できないから質問している
beginnersチャンネルでは、例えば以下のレベルの質問から歓迎します。
: とは何のことですか。
• タプルとは何ですか。
@railo.kanamura has joined the channel
@matsumau5 has joined the channel
@claude0803sz has joined the channel
@aejque has joined the channel
@summit.isys 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

を途中に実行していますね
なるほど、そんなこともできるんですね!
@noahzark2525 has joined the channel
@kibunjojosa has joined the channel
@siosio has joined the channel
@katsutoshiokumura has joined the channel
@a3.works has joined the channel