【问题标题】:In Haskell, could `a` be anything? [closed]在 Haskell 中,“a”可以是任何东西吗? [关闭]
【发布时间】:2018-05-04 08:31:00
【问题描述】:

虽然我一直在阅读文档,但我一直认为a 可以是:

example :: a -> a 

“a”可以是CharStringIntInteger

当然,如果我说:

example :: [a] -> a

输入应该是一个列表,但可以是任何列表:["ab", "cd"][1,2]['s', 'c']

但在我的代码中:

toString' :: (Show a) => [a] -> String
toString' [] = "empty"
toString' [x] = " and " ++ show x
toString' (x:y:[]) = show x ++ toString' [y]
toString' (x:xs) = show x ++ ", " ++ toString' xs

它应该可以工作,但并不总是有效:

Prelude> toString' ['a', 'b', 'c']  -- Works
Prelude> toString' [1, 2, 3]  -- Don't work
Prelude> toString' ["abc", "bc", "efc"] -- Don't work

我不明白为什么我需要添加 Show 约束,如果通常在本书的示例中我不需要它。

更新

好吧,不,这不是从["abc", "bc", "efc]["abc", "bc", "efc"] 的变化,实际上在代码中我是对的,只是在这里我首先输入了错误。

关于Show,如果有必要在这段代码中使用,你能回答我吗?

更新 2

如果你投了反对票,我不知道这是否有用,或者它会被关闭,但无论如何

如果我在最后一行使用代码,代码效果会更好:

toString' (x:xs) = show x ++ ", " ++ (toString' xs)

但仍然不明白为什么我需要Show(我的意思是,为什么我不能从代码中删除它?)

更新 3

我看到Show 的错误,如果你使用变量类型a 而不是String,你需要Show,可能是因为它可能 Haskell 不知道它是哪种类型,直到你输入一个值,所以它需要知道你想要显示它,或者因为某些类型的变量本身不会扩展 Show

【问题讨论】:

  • 最后一个是因为你忘了关闭一个字符串字面量。
  • 第二个确实对我有用。
  • “我也不明白为什么我需要把'show'放在书中的例子中它不需要它。” - 这可能应该是一个单独的问题,你应该详细说明它,例如通过展示您不需要它的示例之一。
  • 投票结束,答案结果是“这是一个错字”的问题不在 SO 上。
  • 好的,谢谢@WillNess ;)

标签: haskell types typeclass type-constraints parametric-polymorphism


【解决方案1】:

我刚刚将您的代码复制到我的 GHCi 中,您的三个示例都可以正常工作。 Prelude> toString' ["abc", "bc", "efc"] 生产 "\"abc\", \"bc\" and \"efc\""

我认为发生的事情是您在没有类型签名的情况下在 GHCi 中尝试了您的定义,并且单态性限制开始生效。这就是为什么只有一个示例对您“有效”。

关于Show约束,既然你用的是show :: Show a => a -> String函数,是的,是必须的。

如果您要定义一个特定 版本toString'Int :: [Int] -> String(或Char),就没有问题。但是您正在为[a] 定义它——为any a。并且由于您使用的是show (x :: a)any 此函数接受的a 必须属于Show。这表示为(Show a) => ....

【讨论】:

    【解决方案2】:

    这不是类型错误,这是语法错误。你只是错过了行尾的结束引号。

    toString' ["abc", "bc", "efc"]
                                ^
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      相关资源
      最近更新 更多