为什么简单的haskell add函数不按预期运行?

时间:2016-05-31 11:32:53

标签: haskell

我正在玩一下haskell回购。 为什么f2表现那样? (我期待f2只接受1个参数),t在类型中的含义是什么?

顺便说一句,为什么我必须使用为repo添加前缀才能定义函数?

λ> :t add  -- f1
add :: Num a => a -> a
λ> let add n = (+) 1  -- f2 what does this mean?
λ> add 1 1
2
λ> :t add
add :: Num a => t -> a -> a
λ> add 1 3
4

2 个答案:

答案 0 :(得分:2)

add n = (+) 1

您从不在右侧使用n。请注意,(+) 1\x -> (+) 1的缩写,您可以看到

add n = (+) 1 = \x -> (+) 1 x

或等同地

add n x = (+) 1 x

因此,n可以是任何类型(此处称为t),因为它根本不使用。

你的意思是

add n = (+) 1 n
  顺便说一句,为什么我必须使用let前缀repo才能定义函数?

因为您正在使用GHCi,而GHCi与在源文件中使用GHC的行为不同。

答案 1 :(得分:0)

您没有使用n,因此它可以是您想要的任何类型。 t不是某种特定类型,它表示某种类型t的参数。

t未在任何地方使用(以及出现问题)的良好迹象是只有a具有Num约束的事实。因此,如果add在添加中实际使用了t,它就能正常工作,它必须能够以某种方式将a添加到任何类型的变量 ,包括不是Num实例的类型。