Haskell 在函数中传递变量并比较每个变量?

Haskell 在函数中传递变量并比较每个变量?,haskell,Haskell,我正在尝试练习Haskell返回和数据类型。我正在尝试将以下信息传递到程序中: worm = 1:2:3:worm eel = [1,2,3,1,2,3,1,2,3] snake = 3:2:1:snake whale = [1..100] 我想创建一个函数,它有一个开关函数来获取数据并将其与定义相匹配。例如,在Python中: def compare(str): #for one case and using string to clarify if str == "1:2:3:wo

我正在尝试练习Haskell返回和数据类型。我正在尝试将以下信息传递到程序中:

worm = 1:2:3:worm
eel = [1,2,3,1,2,3,1,2,3]
snake = 3:2:1:snake
whale = [1..100]
我想创建一个函数,它有一个开关函数来获取数据并将其与定义相匹配。例如,在Python中:

def compare(str): #for one case and using string to clarify
    if str == "1:2:3:worm":
       return "worm"
我知道数据类型是列表,但会引起很多混乱。我的代码给了我一个错误,
无法推断(Num Char)是由使用worm引起的

我的代码:

which :: [a] -> String
which x | x == [1,2,3,1,2,3,1,2,3] = "worm" | x == 3:2:1:snake = "snake" | otherwise = "F"
我还有没有别的办法?为什么函数会给我这个错误?

两个问题:

  • 不能让函数有时返回数字列表,有时返回字符串。这就是强类型语言的全部要点。如果您想要这样的东西,您需要使用sum类型
  • 你不能比较无限的列表。您可以尝试,但您的程序永远不会完成

  • 我希望我的函数只返回字符串。除了“F”之外,您希望它返回什么字符串?这是你唯一使用的字符串。哦,忘了引号了。很抱歉编辑了问题我发现你不太可能仍然得到你说你得到的错误,现在你已经做出了改变。你仍然没有回答我的第二点。这两种说法都是错误的,我甚至不知道你犯了什么错误才开始相信它们。是的,你肯定错过了什么。尝试在GHCi中查看这些内容。Haskell表达式worm=1:2:3:worm与python的“1:2:3:worm”不同。在python中,这是一个由十个字符组成的字符串。在Haskell
    中,worm
    是一个无限长的整数列表。您可以将数字1、2和3添加到。。。数字1、2和3附加到。。。数字1、2和3出现了……以字符串形式返回变量名也没有实际用途;你会用它做什么?