Nie*_*and 4 haskell functional-programming
我在尝试理解Haskell如何确定函数类型时感到有些困惑.这是一个例子:
boolFcn x y = x/=3 && y/=4
Run Code Online (Sandbox Code Playgroud)
当我检查上述函数的类型时,它给出了我的结果:
(Num a1, Num a, Eq a1, Eq a) => a -> a1 -> Bool
Run Code Online (Sandbox Code Playgroud)
这是另一个例子:
triangles = [ (a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10] ]
Run Code Online (Sandbox Code Playgroud)
而apllying :t上triangles与结果:
(Num t2, Num t1, Num t, Enum t2, Enum t1, Enum t) => [(t, t1, t2)]
Run Code Online (Sandbox Code Playgroud)
我头脑中出现了一些问题,我自己解决这些问题非常困难:
a, a1文字组成,而三角形的类型由t,t1文字组成?有什么区别a和t?为什么boolFcn的类型不能简化为:
(Num a, Eq a) => a -> a -> Bool
a并且a1具有相同的类型类,所以为什么我不能简单地用它们编写它们a?当我检查功能的类型时:
let sumthis x y = if x > y then x+y else x-y
Run Code Online (Sandbox Code Playgroud)
我得到一个结果:
(Ord a, Num a) => a -> a -> a
Run Code Online (Sandbox Code Playgroud)
为什么不导致:
(Ord a, Num a, Ord a1, Num a1) => a -> a1 -> a
Run Code Online (Sandbox Code Playgroud)
如果这个问题很简单,我很抱歉,不过我很乐意听到这个问题的任何解释/提示.
是的,a而且t基本上是在这些例子中是相同的.差异只是类型推断算法的副作用.
那么,在boolFcn,(Num a, Eq a) => a -> a -> Bool就没有足够的一般,因为前两个参数不一定是同一类型.请考虑以下电话:
boolFcn (4::Int) (4::Double)
这是有效的,因为Int和Double是的成员Num和Eq类型类,但他们显然不是同一类型.在您的sumthis示例中,x并且y必须是相同类型,因为它们用作需要相同类型参数的函数的输入.
我们可以看到,通过检查:t (+),返回(+) :: Num a => a -> a -> a.由于参数+必须是相同的类型,x并且y必须是相同的类型,因此sumthis必须要求相同类型的参数.因此
sumthis (4::Int) (4::Double)
不会有效.