我开始学习haskell,但找不到一种方法来工作main
函数。我已经成功了,但我认为这纯粹是运气,因为我不能再得到它了。
基本上,我想做的是创建一个脚本文件,像runhaskell script.hs
一样从终端运行。
所以基本结构应该是函数声明后面跟着一个main = do
之类的,然后调用函数来打印结果。
例如,我从"Learn you a Haskell"中获取了这段代码,但是下面的代码不起作用:
elem' :: (Eq a) => a -> [a] -> Bool
elem' y ys = foldl (acc x -> if x == y then True else acc) False ys
main :: IO()
main = print (elem' 1 [1,2,3,4])
这给了我错误:
Build FAILED
/home/helton/Desktop/apaga.hs: line 6, column 16:
Warning: Defaulting the following constraint(s) to type `Integer'
(Eq a0)
arising from a use of elem'
at /home/helton/Desktop/apaga.hs:6:16-20
(Num a0)
arising from the literal `1' at /home/helton/Desktop/apaga.hs:6:22
In the first argument of `print', namely `(elem' 1 [1, 2, 3, 4])'
In a stmt of a 'do' block: print (elem' 1 [1, 2, 3, 4])
In the expression: do { print (elem' 1 [1, 2, 3, 4]) }
print (elem' 1 [1,2,3,4])
而我期望的是
> True
尝试替换
print (elem' 1 [1, 2, 3, 4])
print (elem' (1::Int) [1, 2, 3, 4])
这里的问题是Haskell无法确定您的数字文字是否应该被解释为Int
s或Double
s或任何其他数字类型。
在这里指定任何数字字面值的类型就足够了,因为elem'
要求它们都是相同的类型,因此一旦其中任何一个的类型已知,该类型就可以用于其他所有内容。