0

私はプログラミング言語として関数型プログラミングと Haskell の初心者です。コマンドラインから数値を入力した後、それらの数値をリストに入れ、そのリストをパラメーターとして渡して合計を計算します。ここに私が取り組んでいるものがあります:

import Data.List

iotxt :: IO ()

main :: IO ()

l1 = []


iotxt = do a <- getLine

        -- read in numbers that are not equal to -1
           insert (read a) l1

           if (not ((read a) == -1.0)) 
               then iotxt
           else do return ()
main = do

        putStrLn("Enter a number [-1 to quit]")
        iotxt

        -- size of the list 
        print(length [l1])
        -- sum 

しかし、リスト内に値を配置しようとすると、次のエラーが発生します。

Couldn't match expected type `IO a0' with actual type `[a1]'
    In the return type of a call of `insert'
    In a stmt of a 'do' block: insert (read a) l1
    In the expression:
      do { a <- getLine;
           insert (read a) l1;
           if (not ((read a) == - 1.0)) then iotxt else do { return () } }
4

2 に答える 2

2

Haskell には変数はなく、すべてが不変です。したがって、後でその値を定義l1して変更しないでください。これは機能しません。

代わりに、iotxt適切に記述する方法を考え、要素を収集して入力リストを に返すようにする必要がありますmain

では、iotxt次の 2 つの状況について考えることができます。

  • 入力が の場合-1、空のリスト[]を返すだけで、それをIObyreturn []
  • 入力が でない場合、-1まずこの値をどこかに保存できますresult。その後、iotxt再帰的に呼び出して、この内部iotxtに残りの入力を処理させる必要があります。最後に return value を取得restresultますrest

IO aさらに、 type の値を返すプログラム (入力からの読み取りや出力への書き込みなどの副作用がある可能性があります) のように考えることができますa。your の定義によるとiotxt、これは a を満たすまで入力を読み取り-1、代わりにリストを返すプログラムであり、 の型シグネチャは でiotxtある必要がありますIO [Float]

あなたのコードにはa がありlength [l1]、これは 1 つの要素 (すなわちl1) のみを持つリストを構築するため、length [l1]常に を返し1ます。length l1これを行う代わりに、 の長さを計算すると言うことができますl1

最後に、関数の引数を括弧でグループ化する必要はありませf xん。fx

コードを少し修正しました。お役に立てれば幸いです。

import Data.List

-- iotxt reads from stdin, yields [Float]
-- stop reading when "-1" is read
iotxt :: IO [Float]

main :: IO ()

iotxt = do
    a <- getLine
    -- read in numbers that are not equal to -1
    let result = (read a) :: Float
    if (not (result == -1.0)) 
        then do
            -- read rest of the list from stdin
            rest <- iotxt
            -- put head & tail together
            return $ result:rest
        else do return []

main = do
    putStrLn("Enter a number [-1 to quit]")
    l1 <- iotxt
    -- size of the list 
    print $ length l1
    -- sum 
    print $ sum l1
于 2013-11-11T23:58:16.557 に答える