我一直在阅读一些材料,在这里我有一个问题: 我看到一段代码是这样的:
>getNthElem 1 xs = head xs
>getNthElem n [] = error "'n' is greater than the length of the list"
>getNthElem n xs
> | n < 1 = error "'n' is non-positive"
> | otherwise = getNthElem (n-1) (tail xs)
我应该将所有这些行完全相同地输入到ghci中,还是应该创建一个.hs文件并将其放入,然后将其加载到ghci中?
答案 0 :(得分:13)
有两种方法可以做到这一点:
通过将标志设置为:
,在ghci中使用多行模式 Prelude> :set +m
Prelude> let getNthElem 1 xs = head xs
Prelude| getNthElem n [] = error "error1"
Prelude| getNthElem n xs
Prelude| | n < 1 = error "error2"
Prelude| | otherwise = getNthElem (n-1) (tail xs)
Prelude|
Prelude>
创建一个文件并将其作为模块加载,以访问其中定义的类型和函数
Prelude> :l myModule.hs
文件内容:
getNthElem :: Int -> [a] -> a
getNthElem 1 xs = head xs
getNthElem n [] = error "'n' is greater than the length of the list"
getNthElem n xs
| n < 1 = error "'n' is non-positive"
| otherwise = getNthElem (n-1) (tail xs)
我建议使用第二个选项,因为很容易在GHCI中的多行模式下弄乱缩进。另外,在开始定义函数体之前,养成添加类型签名的习惯。
答案 1 :(得分:9)
你可以写一行:
> let getNthElem 1 xs = head xs; getNthElem n [] = error "'n' is greater than the length of the list"; getNthElem n xs | n < 1 = error "'n' is non-positive" | otherwise = getNthElem (n-1) (tail xs)
不要忘记编写分号而不是换行符,并在开头添加let
字。
你也可以使用多线制度:
> :{
| let getNthElem 1 xs = head xs
| getNthElem n [] = error "'n' is greater than the length of the list"
| getNthElem n xs
| | n < 1 = error "'n' is non-positive"
| | otherwise = getNthElem (n-1) (tail xs)
| :}
>
答案 2 :(得分:5)
最简单的方法是创建一个名为eg的文件。 example.hs
然后在命令行启动ghci并加载文件
$ ghci
GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help
Prelude> :load example.hs
[1 of 1] Compiling Main ( example.hs, interpreted )
Ok, module loaded: Main.
*Main>
或者,您可以在启动ghci时加载文件
$ ghci example.hs
GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help
[1 of 1] Compiling Main ( example.hs, interpreted )
Ok, module loaded: Main.
*Main>
请注意,每行开头的>
表示您的文件是识字的Haskell 文件,即它应该具有扩展名* .lhs而不是* .hs。您应该将文件重命名为* .lhs或删除每行开头的>
。