我正在玩一下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
答案 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
实例的类型。