0

平均を取得する必要があるため、ユーザーが負の数を入力するまで入力が停止し、出力が平均になります

  {
    getFloat :: IO Float
    getFloat = do line <- getLine
                    return (read line:: Float) 


    average :: IO Float
    average =  helper summ n
                    where
                    helper :: Float->Float->IO Float
                    helper summ n = do val<-getFloat
                                       if (val<0)
                                          then (return average)
                                          else ( do summ = summ + val
                                                    n = n+1
                                                    average= summ/n
                                                    average)
                                                         }
4

2 に答える 2

2

純粋な計算と不純な計算を分離することをお勧めします。つまり、IO効果がないaverage可能性があります。[a] -> b

main = print =<< average `fmap` go []
  where
    go :: [Int] -> IO [Int]
    go xs = do
      x <- (read :: String -> Int) `fmap` getLine
      if x < 0 then return (x : xs) else go (x : xs)

    average :: [Int] -> Float
    average xs = (fromIntegral $ sum xs) / (fromIntegral $ length xs)

ちなみに、これは最善の解決策ではありません。

于 2013-02-21T19:28:05.687 に答える
0

次のようなものを試してください。

main = do (s,n) <- getnums
          putStrLn $ show $ s / (fromIntegral n)

getnums :: IO (Float, Int)
getnums = go 0.0 0
  where go s n = do line <- getLine
                    let f = read line :: Float
                    if f < 0 then return (s,n)
                             else go (s+f) (n+1)
于 2013-02-21T19:28:22.423 に答える