Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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,这是我的密码 module Main where import Control.Monad (mapM) import Text.Read (readMaybe) import System.IO (BufferMode(..), stdout, hSetBuffering) mouth = [('P',0),('(',1),('[',2),(')',3),('O',4)] eyes = [(':',1),('8',2),(';',3)] findKey :: (Eq k)

这是我的密码

module Main where

import Control.Monad (mapM)  
import Text.Read (readMaybe)  
import System.IO (BufferMode(..), stdout, hSetBuffering)

mouth = [('P',0),('(',1),('[',2),(')',3),('O',4)]  
eyes = [(':',1),('8',2),(';',3)]   
findKey :: (Eq k) => k -> [(k,v)] -> Maybe v  
findKey key = foldr (\(k,v) acc -> if key == k then Just v else acc) Nothing  

query :: Read a => String -> IO a  
query prompt = do  
 putStr $ prompt ++ ": "  
 val <- readMaybe <$> getLine  
  case val of  
    Nothing -> do  
      putStrLn "Sorry that's a wrong value - please reenter"  
      query prompt  
    Just v -> return v  

ngoers :: IO Int  
ngoers = query "Enter the number of Concertgoers"  

cgoers :: Int -> IO (Int, Double)  
cgoers i = do  
  c <- query prompt  
  return (fromIntegral i,c)
  where prompt = "Enter the emoticon for concertgoer " ++ show (i+1)  

concertgoer :: IO [(Int, Double)]  
concertgoer = do  
  n <- ngoers  
  mapM cgoers [0,1..n-1]  

presentResult :: Double -> IO ()  
presentResult v = putStrLn $ "The results are: " ++ show v  

main :: IO ()  
main = do  
  p <- concertgoer  
  presentResult $ 0

从你的例子中,我猜你将每只眼睛和嘴巴与一个数字匹配,如果这些数字。。。但是你没有在你的帖子中解释这一点。假设是这样,这是一种非常幼稚的写作方式

import Control.Monad (mapM)  

-- Define the data you want to use
data Eye = Normal 
         | Glasses 
         | Wink 
         deriving(Show, Eq)
data Mouth = P 
           | Sad 
           | Bracket 
           | Happy 
           | O 
           deriving(Show, Eq)
data Face  = Face Eye Mouth deriving(Show, Eq)

-- Define special readers and elemToInt
readEyes :: Char -> Maybe Eye
readEyes c = case c of
  ':' -> Just Normal
  '8' -> Just Glasses
  ';' -> Just Wink
  _   -> Nothing

-- This is equivalent to derive Enum class and apply fromEnum. Try to do it your self ;)
eyeToInt :: Eye -> Int
eyeToInt Normal  = 1
eyeToInt Glasses = 2
eyeToInt Wink    = 3

readMouth ::  Char -> Maybe Mouth
readMouth c = case c of
  'P' -> Just P
  '(' -> Just Sad
  '[' -> Just Bracket
  ')' -> Just Happy
  'O' -> Just O
  _   -> Nothing

mouthToInt :: Mouth -> Int
mouthToInt P       = 0
mouthToInt Sad     = 1
mouthToInt Bracket = 2
mouthToInt Happy   = 3
mouthToInt O       = 4

readFace :: String -> Maybe Face
readFace []    = Nothing
readFace [e,m] = do 
  eye   <- readEyes e
  mouth <- readMouth m
  return $ Face eye mouth
readFace _     = Nothing

faceToInt :: Face -> Int
faceToInt (Face e m) = eyeToInt e + mouthToInt m

-- The main loop is straight forward
main :: IO ()
main = do
  putStrLn "Enter the number of Concertgoers"
  number  <- read <$> getLine -- Use safe reading better... I am using an online repl so no access to it
  results <- mapM getEmoticon [1..number]
  putStrLn $ "The results are: " ++ show results
    where getEmoticon n = do
             putStrLn $ "Enter the emoticon for concertgoer " ++ show n
             face <- readFace <$> getLine
             case face of 
               Nothing -> do
                 putStrLn "That's not an emotion!!"
                 getEmoticon n
               Just f  -> return $ faceToInt f

我想这是你所期望的,但是让我知道你有什么错误呢?从我的代码中,我可以输入有多少人进入了con,我的问题是如何根据他们的表情得到结果,因为我的代码似乎无法读取嘴和眼睛阵列上的字符,只接受整数。然后将你的问题简化为真正有趣的部分表情->Int,指定确切的行为,解释你是如何尝试实现它的,以及你在哪里陷入困境。谢谢兄弟:你明白我的意思了:Thakyou太多了。。。上帝保佑
import Control.Monad (mapM)  

-- Define the data you want to use
data Eye = Normal 
         | Glasses 
         | Wink 
         deriving(Show, Eq)
data Mouth = P 
           | Sad 
           | Bracket 
           | Happy 
           | O 
           deriving(Show, Eq)
data Face  = Face Eye Mouth deriving(Show, Eq)

-- Define special readers and elemToInt
readEyes :: Char -> Maybe Eye
readEyes c = case c of
  ':' -> Just Normal
  '8' -> Just Glasses
  ';' -> Just Wink
  _   -> Nothing

-- This is equivalent to derive Enum class and apply fromEnum. Try to do it your self ;)
eyeToInt :: Eye -> Int
eyeToInt Normal  = 1
eyeToInt Glasses = 2
eyeToInt Wink    = 3

readMouth ::  Char -> Maybe Mouth
readMouth c = case c of
  'P' -> Just P
  '(' -> Just Sad
  '[' -> Just Bracket
  ')' -> Just Happy
  'O' -> Just O
  _   -> Nothing

mouthToInt :: Mouth -> Int
mouthToInt P       = 0
mouthToInt Sad     = 1
mouthToInt Bracket = 2
mouthToInt Happy   = 3
mouthToInt O       = 4

readFace :: String -> Maybe Face
readFace []    = Nothing
readFace [e,m] = do 
  eye   <- readEyes e
  mouth <- readMouth m
  return $ Face eye mouth
readFace _     = Nothing

faceToInt :: Face -> Int
faceToInt (Face e m) = eyeToInt e + mouthToInt m

-- The main loop is straight forward
main :: IO ()
main = do
  putStrLn "Enter the number of Concertgoers"
  number  <- read <$> getLine -- Use safe reading better... I am using an online repl so no access to it
  results <- mapM getEmoticon [1..number]
  putStrLn $ "The results are: " ++ show results
    where getEmoticon n = do
             putStrLn $ "Enter the emoticon for concertgoer " ++ show n
             face <- readFace <$> getLine
             case face of 
               Nothing -> do
                 putStrLn "That's not an emotion!!"
                 getEmoticon n
               Just f  -> return $ faceToInt f