Haskell中的匿名函数类型

hei*_*584 1 haskell

我在Haskell中键入匿名函数时遇到问题。例如,当我们有:

\x -> x 5
Run Code Online (Sandbox Code Playgroud)

Num t1 => (t1 -> t2) -> t2我确定GHCI中检查的类型是相反的。

\x -> a * x
Run Code Online (Sandbox Code Playgroud)

Num a => a -> a(我知道我们需要假设a是一个整数,因为(*)的类型是Int-> Int-> Int(没有类型类)。
另一个例子是

\f -> f x
Run Code Online (Sandbox Code Playgroud)

据我所检查的是(s-(a-> b)-> b

但是我完全担心键入匿名函数。了解这一点的魔力是什么?也许可以将此函数重写为“正常”函数以清楚地看到类型?

我的问题是:我们如何获得这些类型?他们来自哪里以及如何评估?

jpm*_*ier 5

>>我们如何获得这些类型的?

这些类型是Haskell系统可以从其唯一的东西(即用户给出的定义,例如“ x 5”)中得出的。

重要的不是该函数是匿名的。这是因为该函数未显式键入,因此Haskell系统必须从表达式中“猜测”该类型。

Prelude> let a=4
Prelude> :t  \x -> a * x
\x -> a * x :: Num a => a -> a
Prelude> 
Prelude> let f1 x = a*x
Prelude> :t f1
f1 :: Num a => a -> a
Prelude> 
Run Code Online (Sandbox Code Playgroud)

因此,匿名和命名版本的类型完全相同。

当然,您可以更具体:

Prelude> let f4 :: Double -> Double ; f4 x = 4*x
Prelude> :t f4
f4 :: Double -> Double
Prelude>
Run Code Online (Sandbox Code Playgroud)

Haskell不会强迫您显式键入所有内容。它接受所有显式键入信息(例如对于f4),以及由定义和对库函数的调用所产生的隐式键入信息,作为键入约束。

如果可以明确解决这些限制,那就好了;如上文chi所提到的,这称为类型推断。否则,如果键入约束是矛盾的或不明确的,则执行将中止。