【发布时间】:2018-02-21 00:20:48
【问题描述】:
启用-hints 选项后,编译器会针对以下程序发出提示消息:
module Main where
main :: IO ()
main = do
let magic :: Int -- (A)
magic = 123
println magic
.
$ fregec -hints Main.fr
H Main.fr:5: let definition is a constant: magic
calling: javac -cp /home/yohashi/lib/java/fregec.jar:. -d . -sourcepath . -encoding UTF-8 ./Main.java
这个提示试图“暗示”反对什么?
如果我省略了 (A) 行上的类型注释(抱歉,术语不正确),提示就会消失:
main = do
let magic = 123
...
类型归属也不会带来提示:
main = do
let magic = 123 :: Int
where 声明也会发生同样的事情:
main = println magic
where
magic :: Int
magic = 123 -- let definition is a constant: magic
magica = 123 -- no hint
magicb = 123 :: Int -- no hint
magicfun :: Int -> Int
magicfun = succ -- let definition is a constant: magicfun
magicfuna = succ -- no hint
magicfunb = succ :: Int -> Int -- no hint
magicfunc :: Int -> Int
magicfunc i = succ i -- no hint
magicfun 上的提示特别烦人,因为它不鼓励使用无点表示法(与 magicfunc 相比)。
所以我的问题是:这个提示背后的动机是什么?
我认为为简单或复杂的表达式提供别名是let/where 的有效用途。提示是否另有暗示?
【问题讨论】:
标签: frege