Render Number,Bool,String as String在haskell中失败

时间:2015-07-10 10:43:59

标签: haskell

我有一个小程序,它接受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没有接受字符串输入?

2 个答案:

答案 0 :(得分:4)

您的data声明定义了类型Value以及三个构造函数:NumberBoolString。您的renderValue函数需要Value参数,而在

renderValue "bye, saravana"

您正在提供String(这是[Char])参数的别名。您需要提供Value

renderValue (String "bye, saravana")

您还应该考虑重命名Value的构造函数,因为它们会与现有的StringBool类型发生冲突,这可能会造成一些混淆。

答案 1 :(得分:-1)

  1. 请注意,您不需要在String案例中使用Show,因为它已经有正确的类型。

  2. 如果您不使用EqBool False,则无需派生。

  3. 您的代码没有为-Wall定义案例(通过使用Show进行验证),您可以重用Bool False实例同时处理Truemodule 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"

  4. 以下是代码:

    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();
    });