如果测试从命令行输入的字符串

时间:2014-11-08 08:55:53

标签: haskell

如何编写if函数并将其置于char上?

就像我写这个函数一样:

import System.IO

start::Char->IO()String
start s =
  if s == 'instructions'
    then instructions
  else
    putStrLn "Look"

main = do
  putStrLn "Enter"
  n <- readLn :: Char
  start n

从用户那里获取输入,比如“指令”或者某些东西,然后我用它调用start函数并从那里调用指令函数。 代码有什么问题?

3 个答案:

答案 0 :(得分:4)

Char是单个字符,而String是字符列表,即[Char]。如果您要将start的参数与"instructions"进行比较,则需要将其设为String,并将instructions括在双引号中。

if表达式的语法为if condition then e1 else e2,因此您需要在then之前添加instructions

您可能希望使用getLine代替readLn从控制台获取String

instructions :: IO ()
instruction = ...

start :: String -> IO ()
start s = 
  if s == "instructions"
    then instructions
  else
    putStrLn "Look"

main = do
  putStrLn "Enter"
  n <- getLine
  start n

答案 1 :(得分:2)

要点:

  • 首先,您认为Char与多字符字符串相同。它不是,Char只是一个字符,所以永远不能等于"instructions"(我认为编译器会发现它)。因此,在大多数情况下,当您期望任何可能超过一个字符的内容时,您应该使用StringString[Char]基本相同,它是一个单个字符数组。

  • 其次,Haskell中的文字String需要用双引号括起来,所以它应该是"instructions"

  • 第三,readLn的类型必须为IO String,而不仅仅是String

  • 第四,我会使用getLine而不是readLn,因为readLn会要求用户为字符串输入引号:用户必须输入"instructions"包括双引号,我怀疑它不是你所追求的

将所有这些放在一起,使用instructions

的虚拟实现
import System.IO

instructions :: IO()
instructions = putStrLn "Some instructions"

start:: String -> IO()
start s = if s == "instructions"
          then
            instructions
          else
            putStrLn "Look"

main :: IO ()
main = do
  putStrLn "Enter"
  n <- getLine :: IO String
  start n

答案 2 :(得分:1)

首先,您需要了解字符串和字符之间的区别。这是计算机编程的一个非常基本的概念。在Haskell(和许多其他语言)中,单引号表示字符,双引号表示字符串。换句话说,改变

if s == 'instructions'

if s == "instructions"

另外,更改

start::Char->IO()String

start :: String -> IO()