如何使用ghci编程haskell?

时间:2014-08-26 08:12:35

标签: haskell ghci

我一直在阅读一些材料,在这里我有一个问题: 我看到一段代码是这样的:

>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中?

3 个答案:

答案 0 :(得分:13)

有两种方法可以做到这一点:

  1. 通过将标志设置为:

    ,在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>       
    
  2. 创建一个文件并将其作为模块加载,以访问其中定义的类型和函数

    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)
    
  3. 我建议使用第二个选项,因为很容易在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或删除每行开头的>