Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 使用防护装置帮助解决问题-使用代码更新_Haskell - Fatal编程技术网

Haskell 使用防护装置帮助解决问题-使用代码更新

Haskell 使用防护装置帮助解决问题-使用代码更新,haskell,Haskell,我在函数内部使用了防护,但不是在函数签名之后立即使用。防护装置位于函数体内部的do语句下。我得到这个错误: parse error on input `|' 我想可能是缩进造成的错误,但我试过很多次缩进,但还是有错误。我问是不是因为警卫没有立即跟踪函数签名,这就是为什么我会出现错误 谢谢 更新1 代码: 假设用户猜测一个数字,如果数字相同,就会将其与随机数进行比较。如果不正确,则用户将猜测,直到函数中的“guess”变量为零。在每次迭代中,该值(猜测值)减少一 例如:puzz125。用户可以猜

我在函数内部使用了防护,但不是在函数签名之后立即使用。防护装置位于函数体内部的do语句下。我得到这个错误:

parse error on input `|'
我想可能是缩进造成的错误,但我试过很多次缩进,但还是有错误。我问是不是因为警卫没有立即跟踪函数签名,这就是为什么我会出现错误

谢谢

更新1

代码: 假设用户猜测一个数字,如果数字相同,就会将其与随机数进行比较。如果不正确,则用户将猜测,直到函数中的“guess”变量为零。在每次迭代中,该值(猜测值)减少一

例如:
puzz125
。用户可以猜测五次,随机数将在1到12之间选取。这就是函数应该做的,但它不起作用

puzz :: Int -> Int -> IO ()
puzz boundary guess = do
                          putStr "Guess" 
                          -- putStr  -- I have to print (1 .. guess) here in each iteration
                          putStr ":"
                          x <- randomRIO (1, boundary :: Int)
                          n <- getLine
                          let
                             nTo = read n::Int
                            in print x
                               | guess == 0 = putStr "You couldn't guess right,the   correct answer is" ++ x
                               | nTo > x = putStr "lower"
                               | nTo < x = putStr "higer"
                               | nTo == x =  putStr "Congrat, You guess right."
                               | otherwise raad boundary (guess - 1)

感谢您的帮助

您不正确地使用了防护装置:

case表达式中的顶级模式以及函数或模式绑定中的顶级模式集可能具有零个或多个关联的保护

所以它们只适用于案例和函数绑定。如果您只想简洁地介绍一系列真-假测试,而在do表示法中,那么()的
case()技巧可能会奏效:

main = do
    putStrLn "hello world"
    n <- getLine
    let nTo = read n :: Int
    case ()
      of () | cond -> putStrLn "foo"
            | cond' -> putStrLn "bar"
            | otherwise -> putStrLn "baz"
main=do
putStrLn“你好,世界”
n putStrLn“foo”
|cond'->putStrLn“bar”
|否则->putStrLn“baz”

您未正确使用防护装置:

case表达式中的顶级模式以及函数或模式绑定中的顶级模式集可能具有零个或多个关联的保护

所以它们只适用于案例和函数绑定。如果您只想简洁地介绍一系列真-假测试,而在do表示法中,那么()的
case()技巧可能会奏效:

main = do
    putStrLn "hello world"
    n <- getLine
    let nTo = read n :: Int
    case ()
      of () | cond -> putStrLn "foo"
            | cond' -> putStrLn "bar"
            | otherwise -> putStrLn "baz"
main=do
putStrLn“你好,世界”
n putStrLn“foo”
|cond'->putStrLn“bar”
|否则->putStrLn“baz”

应该注意的是,除了错误地使用防护之外,还有一些东西与代码有点不一致。默认情况下,输出缓冲在haskell中,因此如果您希望Guess与输入位于同一行,您必须说不应缓冲标准输出(
hSetBuffering标准输出不缓冲
),或者必须使用
hFlush
刷新输出。无需编写
boundary::Int
,编译器知道它是一个Int。下面是一个更完整的示例,我相信它可以做得更好,但至少可以工作:

import Control.Monad(liftM,unless)
import System.IO(hFlush,stdout)
import System.Random(randomRIO)

guessMyNumber upper guesses = do 
  putStrLn $ "Guess a number between 1 and " ++ show upper ++ "!"
  randomRIO (1, upper) >>= puzz guesses

puzz 0 number = do
  putStrLn $ "Sorry, no more guesses, the number was " 
          ++ show number ++ "."

puzz guesses number = do  
  putStr "Guess:" >> hFlush stdout 
  guess <- liftM read getLine
  printMessage guess number guesses

printMessage guess number guesses
  | number > guess = putStrLn "higer" >> puzz (guesses-1) number  
  | number < guess = putStrLn "lower" >> puzz (guesses-1) number
  | number == guess =  putStrLn "Congratulations! You guessed right!"
import Control.Monad(liftM,除非另有说明)
导入系统.IO(hFlush、stdout)
导入系统随机(randomRIO)
guessMyNumber上限猜测=do
putStrLn$“猜一个介于1和“++显示上限++”之间的数字!”
randomRIO(1,上)>>=puzz猜测
puzz 0编号=do
putStrLn$“对不起,不要再猜了,号码是”
++显示数字++”
puzz猜测数=do
putStr“猜:”>>hFlush stdout
guess guess=putStrLn“higer”>>puzz(猜测-1)数
|数字>puzz(猜测-1)数字
|祝贺你!你猜对了

应该注意的是,除了错误地使用防护之外,还有一些东西与代码有点不一致。默认情况下,输出缓冲在haskell中,因此如果您希望Guess与输入位于同一行,您必须说不应缓冲标准输出(
hSetBuffering标准输出不缓冲
),或者必须使用
hFlush
刷新输出。无需编写
boundary::Int
,编译器知道它是一个Int。下面是一个更完整的示例,我相信它可以做得更好,但至少可以工作:

import Control.Monad(liftM,unless)
import System.IO(hFlush,stdout)
import System.Random(randomRIO)

guessMyNumber upper guesses = do 
  putStrLn $ "Guess a number between 1 and " ++ show upper ++ "!"
  randomRIO (1, upper) >>= puzz guesses

puzz 0 number = do
  putStrLn $ "Sorry, no more guesses, the number was " 
          ++ show number ++ "."

puzz guesses number = do  
  putStr "Guess:" >> hFlush stdout 
  guess <- liftM read getLine
  printMessage guess number guesses

printMessage guess number guesses
  | number > guess = putStrLn "higer" >> puzz (guesses-1) number  
  | number < guess = putStrLn "lower" >> puzz (guesses-1) number
  | number == guess =  putStrLn "Congratulations! You guessed right!"
import Control.Monad(liftM,除非另有说明)
导入系统.IO(hFlush、stdout)
导入系统随机(randomRIO)
guessMyNumber上限猜测=do
putStrLn$“猜一个介于1和“++显示上限++”之间的数字!”
randomRIO(1,上)>>=puzz猜测
puzz 0编号=do
putStrLn$“对不起,不要再猜了,号码是”
++显示数字++”
puzz猜测数=do
putStr“猜:”>>hFlush stdout
guess guess=putStrLn“higer”>>puzz(猜测-1)数
|数字>puzz(猜测-1)数字
|祝贺你!你猜对了

您似乎对什么是警卫有很大的误解。如果你发布了你的代码,我们可以看到你试图实现什么,并澄清这个误解。你似乎对什么是守卫有很大的误解。如果你发布了你的代码,我们可以看到你想要达到的目标,并澄清这个误解。