haskell阅读和迭代

0 haskell loops

我需要你的帮助.我试图在haskell学习并做一个简单的任务,但对我来说仍然很难.我想要做的是:读取用空格分隔的一行数字,迭代该列表,检查值,如果值不为零,则加1,否则为-1.我试着看一些教程和其他项目代码,但它只输出一堆错误.我的代码:

import System.Environment
import Control.Monad
import Text.Printf
import Data.List
import System.IO

solve :: IO ()
solve = do
    nums <- map read . words <$> getLine
    print (calculate nums)

calculate (x:xs) = x + check xs

check num
    | num == 0 =
        -1
    | otherwise = 
        1

main :: IO ()
main = do
    n <- readLn
    if n /= 0
        then do 
            printf "Case: "
            solve
        else main
Run Code Online (Sandbox Code Playgroud)

错误:

C:\Users\Donatas\Documents\haskell\la3.hs:9:21: error:
    * Ambiguous type variable `b0' arising from a use of `read'
      prevents the constraint `(Read b0)' from being solved.
      Probable fix: use a type annotation to specify what `b0' should be.
      These potential instances exist:
        instance Read BufferMode -- Defined in `GHC.IO.Handle.Types'
        instance Read Newline -- Defined in `GHC.IO.Handle.Types'
        instance Read NewlineMode -- Defined in `GHC.IO.Handle.Types'
        ...plus 25 others
        ...plus six instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
    * In the first argument of `map', namely `read'
      In the first argument of `(.)', namely `map read'
      In the first argument of `(<$>)', namely `map read . words'
  |
9 |         nums <- map read . words <$> getLine
  |                     ^^^^

C:\Users\Donatas\Documents\haskell\la3.hs:10:9: error:
    * Ambiguous type variable `a0' arising from a use of `print'
      prevents the constraint `(Show a0)' from being solved.
      Probable fix: use a type annotation to specify what `a0' should be.
      These potential instances exist:
        instance Show HandlePosn -- Defined in `GHC.IO.Handle'
        instance Show BufferMode -- Defined in `GHC.IO.Handle.Types'
        instance Show Handle -- Defined in `GHC.IO.Handle.Types'
        ...plus 27 others
        ...plus 13 instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
    * In a stmt of a 'do' block: print (calculate nums)
      In the expression:
        do nums <- map read . words <$> getLine
           print (calculate nums)
      In an equation for `solve':
          solve
            = do nums <- map read . words <$> getLine
                 print (calculate nums)
   |
10 |         print (calculate nums)
   |         ^^^^^^^^^^^^^^^^^^^^^^

C:\Users\Donatas\Documents\haskell\la3.hs:12:1: error:
    * Non type-variable argument in the constraint: Num [a]
      (Use FlexibleContexts to permit this)
    * When checking the inferred type
        calculate :: forall a. (Eq a, Num [a], Num a) => [a] -> a
   |
12 | calculate (x:xs) = x + check xs
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Failed, no modules loaded.
Run Code Online (Sandbox Code Playgroud)

Jor*_*kie 5

首先,我建议您默认始终编写类型注释.在开始实现任何内容之前,请勾勒出程序的类型.对于这个程序,我建议你从以下开始:

main :: IO ()

solve :: String -> String

calculate :: [Int] -> Int

check :: Int -> Int
Run Code Online (Sandbox Code Playgroud)

这些名字也可能会得到改进,以便更好地传达他们正在做的事情.

请注意,只有一个类型的函数IO _.这可以隔离程序中不纯的部分,这将使您的生活更轻松(例如测试,代码推理等).

你离我不远.只需尝试重新编写代码以适应上述类型.请注意,您在实现中缺少一个模式calculate;)