如何编写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函数并从那里调用指令函数。 代码有什么问题?
答案 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"
(我认为编译器会发现它)。因此,在大多数情况下,当您期望任何可能超过一个字符的内容时,您应该使用String
。 String
与[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()