在Haskell中的列表上进行映射:约束中的非类型变量参数

hgi*_*sel 2 mapping haskell

let fun1  = (+3)
let fun2  = (-3)
let range = [1,2,3,3]
let a = map fun1 range
let b = map fun2 a
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:

约束中的非类型变量参数:Num(a - > b)

Haskell的静态性质让我很头疼......

Wil*_*sem 5

实际上,这里的语法比类型系统更让你头疼.那是因为(-3)实际上是数字" 减三 ":

fun2 :: Num a => a
Run Code Online (Sandbox Code Playgroud)

所以问题是你没有真正提供一个函数,而是更多的常量.

你可以通过编写来解决它:

let fun2 = \x -> x-3
Run Code Online (Sandbox Code Playgroud)

要么:

let fun2 = (+) (-3)
Run Code Online (Sandbox Code Playgroud)

Haskell的静态性质让我很头疼......

实际上,当用Haskell编写程序时我会睡得更好,因为在动态类型语言中你常常有" 狼人日 ":所有出错的日子.

  • 正好添加了`Prelude`函数`subtract`来实现`(-3)`如果它是一个部分.例如,可以"映射(减去3)xs". (4认同)