为什么ghci 在我通过模式匹配构造的函数的类型签名中列出了一个相等类型约束matchInt:
$ ghci
GHCi, version 8.2.1: http://www.haskell.org/ghc/ :? for help
Prelude> :{
Prelude| matchInt 1 = 3
Prelude| matchInt _ = 4
Prelude| :}
Prelude> matchInt 1
3
Prelude> matchInt 22
4
Prelude> :t matchInt
matchInt :: (Eq a, Num a, Num p) => a -> p
Run Code Online (Sandbox Code Playgroud)
相反,当使用简单的数据构造函数时,没有相等类型约束.
$ ghci
GHCi, version 8.2.1: http://www.haskell.org/ghc/ :? for help
Prelude> data Z = Y Int
Prelude> :{
Prelude| matchDataInt (Y 1) = 3
Prelude| matchDataInt _ = …Run Code Online (Sandbox Code Playgroud) 为什么printf "%d\n" 3暧昧而不是show 3?是否printf可以重写模块以提供自动消除歧义?据推测,show必须在较低层次上完成printf......或者是否存在一些重要的区别printf,show这需要消除数字的歧义?
如果printf 可以重写以自动处理数字而不明确消除歧义,那么正在show做什么?如何在show不:: Int消除歧义的情况下将数字转换为字符串printf?
这是show(没有消除歧义)的正确操作以及printf(消除歧义)的正确操作:
$ cat printStrLnShow3
import Text.Printf
main = putStrLn (show 3)
$ runghc printStrLnShow3
3
$ cat printfWithInt3
import Text.Printf
main = printf "%d\n" (3 :: Int)
$ runghc printfWithInt3
3
Run Code Online (Sandbox Code Playgroud)
这里是不明确的变量时,错误printf也没有歧义的数量:
$ cat printfWithAmbiguous3
import Text.Printf
main = …Run Code Online (Sandbox Code Playgroud) 安装Xcode 8 beta后,我可以从命令行运行Swift 3吗?我看到/ usr/bin/swift仍然是5月5日的Swift 2.2.我希望看到像/ usr/bin/swift3这样的东西,但没有这样的运气.
swift.org下载说"Swift 3.0 Preview 1是Xcode 8.0 beta的一部分." 但我没有找到使用Xcode 8 beta运行命令行Swift 3的说明.
理想情况下,我想使用交互式REPL ...以及对Swift Package Manager代码进行命令行编译.
为什么这个Python程序会冻结/挂起:
$ ls -l freeze.py
-rwx------ 1 rick rick 24 Oct 27 11:40 freeze.py
$ cat freeze.py
import re
print "hello"
$ ./freeze.py
C-c
Run Code Online (Sandbox Code Playgroud)
为什么这个Haskell程序也会冻结/挂起:
$ ls -l freeze.hs
-rwxrw-r-- 1 rick rick 46 Oct 27 11:22 freeze.hs
$ cat freeze.hs
import Text.Regex.Posix
main = print "hello"
$ ./freeze.hs
C-c
Run Code Online (Sandbox Code Playgroud)