相关疑难解决方法(0)

GHCi如何选择类型变量的名称?

使用交互式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)

它选择名称bb1.很明显,重命名必须发生,而只是开始a,b......将给予

map fst :: [(a, b)] -> [a]
Run Code Online (Sandbox Code Playgroud)

相反,我发现它更具可读性.

haskell type-inference ghc ghci type-variables

12
推荐指数
1
解决办法
322
查看次数

了解功能类型

我在尝试理解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 :ttriangles与结果:

(Num t2, Num t1, Num t, Enum t2, Enum t1, Enum t) =>  [(t, t1, t2)]
Run Code Online (Sandbox Code Playgroud)

我头脑中出现了一些问题,我自己解决这些问题非常困难:

  1. 为什么boolFcn的类型由a, a1文字组成,而三角形的类型由t,t1文字组成?有什么区别at
  2. 为什么boolFcn的类型不能简化为:

    (Num a, Eq a) => a -> a …

haskell functional-programming

4
推荐指数
1
解决办法
128
查看次数