【发布时间】:2016-03-08 03:42:55
【问题描述】:
本程序在GHC下编译运行正常:
type Church a = (a -> a) -> a -> a
ch :: Int -> Church a
ch 0 _ = id
ch n f = f . ch (n-1) f
unch :: Church Int -> Int
unch n = n (+1) 0
suc :: Church a -> Church a
suc n f = f . n f
pre :: Church ((a -> a) -> a) -> Church a
pre n f a = n s z id
where s g h = h (g f)
z = const a
main :: IO ()
main = do let seven = ch 7
eight = suc seven
six = pre seven
print (unch eight)
print (unch six)
但是使用 Frege 编译时出现以下错误:
E /home/xgp/work/flab/src/main/frege/flab/fold.fr:23: type error in expression seven
type is : Int
expected: (t1→t1)→t1
E /home/xgp/work/flab/src/main/frege/flab/fold.fr:23: type error in expression seven
type is : (t1→t1)→t1
expected: Int
E /home/xgp/work/flab/src/main/frege/flab/fold.fr:23: type error in expression seven
type is : (t1→t1)→t1
expected: Int
E /home/xgp/work/flab/src/main/frege/flab/fold.fr:23: type error in
expression seven
type is apparently Int
used as function
为什么?是否可以修改程序以通过Frege下的编译?
【问题讨论】:
-
奇怪。但是将
six、seven和eight的定义移到main之外的顶层并将print替换为println是可行的。 -
@0dB,是的,我尝试将它们移动到顶层并编译程序并且所有三个值都是正确的。但是
print确实打印了一些东西,虽然不是它自己的东西。 -
另一个有趣的效果:当我第一次加载修改后的程序(
six在顶层等)并在 REPL 中第一次运行println (unch six),我得到866(我有看到更长的数字),我第二次得到6。但是,这种行为并不一致,:reset有时会直接产生6。 -
注册。
print为你工作(对我来说没有输出),也许你和我有不同的弗雷格版本?我有 3.23.450-gf5b1730。 -
貌似前两个
prints的输出没有被flush,最后一个printlnflush了输出流。
标签: frege