我有一个小程序,它接受Boolean,Number,String中的任何一个并将其呈现为String。
module Main () where
data Value = Number Int
| Bool Bool
| String String
deriving (Eq, Show)
renderValue :: Value -> String
renderValue (String s) = show s
renderValue(Bool True) = "true"
renderValue(Number n) = show n
main = do
putStrLn $ renderValue "bye, saravana"
renderValue是一个重载方法,应该接受String输入。但最后一行,
putStrLn $ renderValue "bye, saravana"
将错误打印为,
Couldn't match expected type ‘Value’ with actual type ‘[Char]’
In the first argument of ‘renderValue’, namely ‘"bye, saravana"’
In the second argument of ‘($)’, namely
‘renderValue "bye, saravana"’
In a stmt of a 'do' block: putStrLn $ renderValue "bye, saravana"
为什么Value = Number | Bool | String
没有接受字符串输入?
答案 0 :(得分:4)
您的data
声明定义了类型Value
以及三个构造函数:Number
,Bool
和String
。您的renderValue
函数需要Value
参数,而在
renderValue "bye, saravana"
您正在提供String
(这是[Char]
)参数的别名。您需要提供Value
即
renderValue (String "bye, saravana")
您还应该考虑重命名Value
的构造函数,因为它们会与现有的String
和Bool
类型发生冲突,这可能会造成一些混淆。
答案 1 :(得分:-1)
请注意,您不需要在String
案例中使用Show
,因为它已经有正确的类型。
如果您不使用Eq
和Bool False
,则无需派生。
您的代码没有为-Wall
定义案例(通过使用Show
进行验证),您可以重用Bool
False
实例同时处理True
和module Main where
import Data.Char
data Value = Number Int
| Bool Bool
| String String
renderValue :: Value -> String
renderValue (String s) = s
renderValue (Bool b) = toLower <$> show b
renderValue (Number n) = show n
main :: IO ()
main = putStrLn $ renderValue $ String "bye, saravana"
。
以下是代码:
OverloadedStrings
或者,如果您想避免输入String
,可以使用{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.Char
import Data.String
data Value = Number Int
| Bool Bool
| String String
instance IsString Value where
fromString = String
renderValue :: Value -> String
renderValue (String s) = s
renderValue (Bool b) = toLower <$> show b
renderValue (Number n) = show n
main :: IO ()
main = putStrLn $ renderValue "bye, saravana"
扩展程序:
.bind('mouseleave', function() {
var $this = $(this);
$this.removeClass('hovered');
$this.children('div').hide();
});