haskell-jp / beginners #22 at 2022-12-27 14:20:39 +0900

do構文の外側で定義した純粋関数にIO a 型の引数を渡す方法について知りたいです。paizaの問題 を解いていて、解答として
f :: Int -> Int -> String
f distance stride_length = if distance * 100000 `div` stride_length >= 10000 then "yes" 
                            else "no"
main = do 
       putStrLn "歩いた距離(km)を入力"
       distance <- readLn :: IO Int
       putStrLn "歩幅(cm)を入力"
       stride_length <- readLn :: IO Int
       return (f distance stride_length)

を提出しました。GHCiにベタ貼りすると、一応このコードでも動きはするけど、解答としては不正解らしいのです。
計算結果を出力するのではなく return してしまっているのが問題なのではないでしょうか。
mainに型注釈を付けて main :: IO () を追加すると何が間違っているのかわかりやすいと思います。
ghciは最後の計算結果の評価を自動で表示してくれますが、単体のプログラムとしてコンパイルするとそういった操作は行ってくれないので、自分でputStrLnする必要があります。
mainに型注釈をつけてdo構文を`{}` で囲むと
Main.hs:7:17: error: parse error on input '"'
  |
7 |        putStrLn "歩いた距離(km)を入力"
  |                 ^

というエラーメッセージが出ます。putStrLnでエラーがあるようです。「自分でputStrLnする」というアドバイスについて、もう少し分かりやすく教えてもらえないでしょうか?
doを波括弧で括ってインデント構文じゃなくてしてセミコロンで区切れるのは、文法上の機能としては存在して、そのスタイルを好む人も存在しますが、今回の問題解決には全く関係がないと思います
また、その機能をうまく使えてないと思うので、とりあえず変えた結果を貼り付けると良いと思います

自分でputStrLnするというのは、mainで計算結果をreturnするのではなく、計算結果をputStrLnする必要があるということです
ありがとうございます。計算結果をputStrLnするコードを書いてみました。
main = do :: IO (){
       putStrLn "歩いた距離(km)を入力"
       distance <- readLn :: IO Int
       putStrLn "歩幅(cm)を入力"
       stride_length <- readLn :: IO Int
       if distance * 100000 `div` stride_length >= 10000 then 
       putStrLn "yes" 
       else 
       putStrLn "no" }

エラーメッセージは
	
Main.hs:4:17: error: parse error on input '"'
|
| putStrLn "歩いた距離(km)を入力"

になります。このコードはghciでも同じものが出て、前にコードと違いghciでも動かないです。
文法が全く違います。
Haskellの入門書を読むなどして型注釈の書き方やdo構文の使い方を学ぶと良いと思います。