Haskell - 无法匹配类型
Haskell - Couldn't match type
我正在尝试在 Haskell 中编写一个函数,它将一个字符串和一个具有模式 [(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
的定义中存在一些问题,而不是在类型签名中:
- 保护选项并不详尽:当 x 不等于 s 时会发生什么?
[(s,f)]
部分不是列表的模式:您会经常使用变量名或模式。
- 如果遍历整个列表后没有找到匹配项会怎样?你抛出一个错误,或者一个 Maybe,或者 return 一个合理的默认值?
考虑此解决方案引发错误:``
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,您还可以 return Just f
和 Nothing
。
我正在尝试在 Haskell 中编写一个函数,它将一个字符串和一个具有模式 [(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
的定义中存在一些问题,而不是在类型签名中:
- 保护选项并不详尽:当 x 不等于 s 时会发生什么?
[(s,f)]
部分不是列表的模式:您会经常使用变量名或模式。- 如果遍历整个列表后没有找到匹配项会怎样?你抛出一个错误,或者一个 Maybe,或者 return 一个合理的默认值?
考虑此解决方案引发错误:``
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,您还可以 return Just f
和 Nothing
。