通过Hutton的新文本,我在ghci中遇到了奇怪的行为。当我从文本文件加载函数altmap时,它的行为正确;但是直接在ghci中输入相同的两行会产生如下错误:
*Main Lib> altmap f g [] = []
*Main Lib> altmap f g (x:y:xs) = (f x):(g y):(altmap f g xs)
*Main Lib> altmap (2*) (3*) [1,2,3,4,5,6]
[2,6,6,12,10,18*** Exception: interactive:2:1-49: Non-exhaustive patterns in function altmap
虽然我很喜欢,但有人可以解释“Prelude”和“Main Lib”之间的区别吗?我正在使用ghc 8.0.2的rc2版本
答案 0 :(得分:0)
altmap
的后一个定义会覆盖较旧的定义。因此,您实际上只定义了一种模式。
基本上,你这样做了:
ghci> x = 5
ghci> x = 42
ghci> print x
42
您需要在同一行中定义两者或使用多行:
*Main Lib> altmap f g [] = []; altmap f g (x:y:xs) = f x : g y : atmap f g xs
请注意,altmap f g xs
也可以写为zipWith ($) (cycle [f,g]) xs
。
关于您的其他问题:>
之前的模块是您当前导入的模块。因此,您导入了Main
(包含所有符号)和Lib
。有关更多信息,请查看GHC文档。