使用交互式GHC解释器时,可以询问表达式的推断类型:
Prelude> :t map
map :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)
它似乎从签名中获取类型变量的名称,因为它map被定义为
map :: (a -> b) -> [a] -> [b]
map _ [] = []
map f (x:xs) = f x : map f xs
Run Code Online (Sandbox Code Playgroud)
在序曲中.这很有道理!我的问题是:当没有给出签名时,如何选择类型变量名?
一个例子是
Prelude> :t map fst
map fst :: [(b, b1)] -> [b]
Run Code Online (Sandbox Code Playgroud)
它选择名称b和b1.很明显,重命名必须发生,而只是开始a,b......将给予
map fst :: [(a, b)] -> [a]
Run Code Online (Sandbox Code Playgroud)
相反,我发现它更具可读性.
我在尝试理解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 …