Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 在哈斯克尔,“a”可能是什么?_Haskell_Types_Typeclass_Type Constraints_Parametric Polymorphism - Fatal编程技术网

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