这个函数的正确类型声明是什么?

Van*_*uel 2 haskell

以下功能无法加载:

charName :: a -> String
charName 'a' = "Alpha"
charName 'b' = "Bravo"
charName 'c' = "Charlie"
charName 'd' = "Delta"
charName 'e' = "Echo"
charName 'f' = "Foxtrot"
charName 'g' = "Golf"
charName 'h' = "Hotel"
charName 'i' = "India"
charName 'j' = "Juliet"
charName 'k' = "Kilo"
charName 'l' = "Lima"
charName 'm' = "mike"
charName 'n' = "November"
charName 'o' = "Oscar"
charName 'p' = "Papa"
charName 'q' = "Quebec"
charName 'r' = "Romeo"
charName 's' = "Sierra"
charName 't' = "Tango"
charName 'u' = "Uniform"
charName 'v' = "Victor"
charName 'w' = "Whiskey"
charName 'x' = "X-ray"
charName 'y' = "Yankee"
charName 'z' = "Zulu"
charName 0 = "Zero"
charName 1 = "One"
charName 2 = "Two"
charName 3 = "Three"
charName 4 = "Four"
charName 5 = "Five"
charName 6 = "Six"
charName 7 = "Seven"
charName 8 = "Eight"
charName 9 = "Nine"
charName x = ""
Run Code Online (Sandbox Code Playgroud)

它给了我以下错误:

[1/1]编译Main(baby.hs,解释)

baby.hs:41:9:无法匹配,期望的类型a' against inferred type字符' a' is a rigid type variable bound by the type signature forCHARNAME'在baby.hs:40:12在图案: 'A'在`CHARNAME定义':CHARNAME 'A'= "阿尔法"

baby.hs:67:9:没有实例(Num Char)来自文字0' at baby.hs:67:9 Possible fix: add an instance declaration for (Num Char) In the pattern: 0 In the definition ofcharName':charName 0 ="Zero"失败,模块加载:无.

不知道我怎么能让它工作.有人有什么想法吗?

sas*_*nin 11

使用新数据类型

将Char或Int作为函数参数传递的简单方法是定义一个新的数据类型来封装它们:

data (Num a) => CharOrNum a = C Char | N a

charName (C 'z') = "Zulu"
charName (N 0) = "Zero"
Run Code Online (Sandbox Code Playgroud)

那你可以像使用它一样

ghci> charName $ C 'z'
"Zulu"
ghci> charName $ N 0
"Zero"
Run Code Online (Sandbox Code Playgroud)

通过这种改变,类型charName(Num t) => CharOrNum t -> [Char].

有了新的类型

另一种方法是为两个参数类型定义一个公共类型类,比如Show.

class Nameable a where
  nameit :: a -> String

instance Nameable Char where
  nameit 'z' = "Zulu"
  nameit _ = ""

instance Nameable Integer where
  nameit 0 = "Zero"
  nameit _ = ""
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

ghci> (nameit 0, nameit 'z')
("Zero","Zulu")
Run Code Online (Sandbox Code Playgroud)


sep*_*p2k 5

不同情况下参数的类型charName不匹配.有时您使用Char(例如'a'),有时您使用数字(例如9).

您无法通过更改类型签名来完成此工作.(嗯,有一种方法:添加一个实例Num Char,但那将是一个非常糟糕的主意).

达到你想要做的唯一理智的方法是将数字改为Chars(即'0'代替0等).

  • 实际上第一个错误不是因为他混合了Char和Int,而是因为charName被声明为类型a - > String所以它必须适用于所有可能的a. (3认同)