我在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
但是我完全担心键入匿名函数。了解这一点的魔力是什么?也许可以将此函数重写为“正常”函数以清楚地看到类型?
我的问题是:我们如何获得这些类型?他们来自哪里以及如何评估?
>>我们如何获得这些类型的?
这些类型是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所提到的,这称为类型推断。否则,如果键入约束是矛盾的或不明确的,则执行将中止。
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |