我想知道我们是否可以在函数外使用?例如
fun::Int->Int
fun n = n + 1
main = do
fun x where x = 30
Run Code Online (Sandbox Code Playgroud)
显然它在编译时不起作用,
我想将x声明为局部变量,仅 用于娱乐
您的函数具有错误的类型,可用作do块中的最终表达式.它需要返回一个Monad m => m Int值,而不仅仅是一个值Int.由于main(在其通常使用中)必须是一个IO动作,这意味着m应该IO.
fun :: Int -> IO Int
fun n = return (n + 1)
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,A let比a更合适where.
main = do
let x = 30 in fun x
Run Code Online (Sandbox Code Playgroud)
现在,仅在调用x范围内.如果你写的fun
main = do
let x = 30
fun x
Run Code Online (Sandbox Code Playgroud)
然后x在技术上是在剩下的do块的范围内,而不仅仅是调用fun.尽管共享相同的关键字let,但是let在do块和正则let表达式之间存在明显的差异.(关系是这样的
do
let name = value
foo
Run Code Online (Sandbox Code Playgroud)
相当于
let name = value
in do
foo
Run Code Online (Sandbox Code Playgroud)
)
请注意,do本身并不能创造一个一元价值; 对于承担单一性质的各种算子来说,它只是语法糖.快速概述:
do { x <- y; foo x; }成为y >>= (\x -> foo x).do { foo; bar; }成为foo >> bar.do { let x = y; foo; } 变 let x = y in do foodo foo成为foo.与您的代码最相关的是规则4; do块中的单个表达式本身等同于表达式,这意味着您可以删除do.只有在do块被去除后,Haskell才开始对结果进行类型检查.
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |