Haskell 在哈斯克尔,“a”可能是什么?
当我阅读文档时,我一直认为Haskell 在哈斯克尔,“a”可能是什么?,haskell,types,typeclass,type-constraints,parametric-polymorphism,Haskell,Types,Typeclass,Type Constraints,Parametric Polymorphism,当我阅读文档时,我一直认为a可以是以下任何内容: example :: a -> a “a”可以是字符,字符串,Int,整数 当然,如果我说: example :: [a] -> a 输入应该是一个列表,但应该是任何内容的列表:[“ab”,“cd”],[1,2]或['s”,“c'] 但在我的代码中: toString' :: (Show a) => [a] -> String toString' [] = "empty" toString' [x] = " and
a
可以是以下任何内容:
example :: a -> a
“a”可以是字符
,字符串
,Int
,整数
当然,如果我说:
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”]
的变化,实际上在代码中我是对的,只是在这里我首先键入了错误
关于节目
,如果有必要在这个代码中使用它,你能回答我吗
更新2
我不知道如果你否决了它,它是否会有用,或者它会被关闭,但无论如何
如果在我使用的最后一行代码中:
toString' (x:xs) = show x ++ ", " ++ (toString' xs)
但是仍然不明白为什么我需要显示(我的意思是,为什么我不能从代码中删除它?)
更新3
我看到了我在Show
中的错误,如果您使用变量类型a
而不是字符串
,您需要Show
,可能是因为它可能在您输入值之前Haskell不知道它是哪种类型,所以它需要知道您想要显示它,或者因为有一些类型的变量不扩展Show
这不是一个类型错误,这是一个语法错误。您只是缺少行末尾的结束引号
toString' ["abc", "bc", "efc"]
^
这不是类型错误,这是语法错误。您只是缺少行末尾的结束引号
toString' ["abc", "bc", "efc"]
^
我刚刚将您的代码复制到我的GHCi中,您的三个示例都可以使用。Prelude>toString'[“abc”、“bc”、“efc”]
“abc\”、“bc\”和“efc\”
我想发生的是,你在没有类型签名的情况下在GHCi中尝试了你的定义,并且引入了单态限制。这就是为什么只有一个例子对你“有效”的原因
关于Show
约束,因为您使用的是Show::Show a=>a->String
函数,是的,这是必需的
如果您要定义一个特定的版本toString'Int::[Int]->String
(或Char
),没有问题。但是您定义它是为了[a]
——为了任何a
。因为您使用的是show(x::a)
,此函数接受的任何a
都必须属于Show
。这表示为(Show a)=>…
,我刚刚将您的代码复制到我的GHCi中,并且您的三个示例都有效。Prelude>toString'[“abc”、“bc”、“efc”]
“abc\”、“bc\”和“efc\”
我想发生的是,你在没有类型签名的情况下在GHCi中尝试了你的定义,并且引入了单态限制。这就是为什么只有一个例子对你“有效”的原因
关于Show
约束,因为您使用的是Show::Show a=>a->String
函数,是的,这是必需的
如果您要定义一个特定的版本toString'Int::[Int]->String
(或Char
),没有问题。但是您定义它是为了[a]
——为了任何a
。因为您使用的是show(x::a)
,此函数接受的任何a
都必须属于Show
。这表示为(Show a)=>…
最后一个原因是您忘记关闭字符串文本。第二个实际上对我有效。”我也不明白为什么我需要在书中的示例中加入“show”,如果通常情况下,它不需要。”-这可能是一个单独的问题,你应该详细说明,例如,通过显示一个你不需要的示例。投票结束,回答为“这是一个打字错误”的问题“你说的太离题了。好的,谢谢@WillNess;)最后一个原因是你忘了关闭字符串文字。第二个事实上对我很有用。“我也不明白为什么我需要把‘show’放在书中通常不需要的例子中。”-这可能是一个单独的问题,你应该详细说明,例如,通过展示其中一个你不需要的例子。投票结束后,回答为“这是一个打字错误”的问题将脱离主题。好的,谢谢@WillNess;)