哈斯克尔 - 无法匹配类型



我正试图在Haskell中编写一个函数,该函数将String和模式为[(String,Float(]的列表作为输入,并输出分配给与我的输入匹配的键String的Float,但我不明白我做错了什么。这是我的代码:

a = [("x",1.21),("y",3.52),("z",6.72)]
val :: String -> [(String, Float)] -> Float
val x [(s,f)]
| x == s    = f

它给了我错误

* Couldn't match type `Double' with `Float'
Expected type: [(String, Float)]
Actual type: [([Char], Double)]
* In the second argument of `val', namely `a'
In the expression: val "x" a
In an equation for `it': it = val "x" a

有人能解释一下我做错了什么吗?这种类型的不匹配是怎么回事?

val的定义中有一些问题,而不是在类型签名中:

  1. 保护选项并不详尽:当x不等于s时会发生什么
  2. [(s,f)]部分不是列表的模式:您通常会使用变量名或模式
  3. 如果遍历整个列表后没有找到匹配项,会发生什么?您是否抛出一个错误,或者一个Maybe,或者返回一个合理的默认值

考虑此解决方案抛出错误:``

val :: String -> [(String, Float)] -> Float
val x [] = error ("Not Found: " ++ show x)    
val x ((s,f):rest)  | s==x = f
| otherwise = val x rest

如果使用Maybes,也可以返回Just fNothing

最新更新