如何使用ghci编程haskell?

use*_*256 9 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)
Run Code Online (Sandbox Code Playgroud)

我应该将所有这些行完全相同地输入到ghci中,还是应该创建一个.hs文件并将其放入,然后将其加载到ghci中?

shr*_*t18 13

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

  1. 通过将标志设置为ghci,在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>       
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个文件并将其作为模块加载,以访问其中定义的类型和函数

    Prelude> :l myModule.hs
    
    Run Code Online (Sandbox Code Playgroud)

    和文件内容:

    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)
    
    Run Code Online (Sandbox Code Playgroud)

我建议使用第二个选项,因为很容易在GHCI中的多行模式下弄乱缩进.另外,在开始定义函数体之前,养成添加类型签名的习惯.


vio*_*ior 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)
Run Code Online (Sandbox Code Playgroud)

不要忘记写分号而不是换行符,并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)
| :}
>
Run Code Online (Sandbox Code Playgroud)


Chr*_*lor 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> 
Run Code Online (Sandbox Code Playgroud)

或者,您可以在启动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> 
Run Code Online (Sandbox Code Playgroud)

请注意,>每行的开头表示您的文件是一个有文化的Haskell文件,即它应该具有扩展*.lhs而不是*.hs.您应该将文件重命名为*.lhs或删除>每行的开头.

  • @ user3928256识字文件中的默认值是文本是注释而不是源,您必须指定源代码实际位于文件中的位置.通常会看到一个有文化的文件,其中有比代码更多的注释,它允许您混合使用不同的格式,例如Markdown和Haskell,或ReST和Python,因此文档生成器可以更轻松地制作格式良好的文档.在Haskell文件文件中,通常在每行代码的开头使用`>`,或者你可以使用LaTeX样式并在`\ begin {code}`-`\end {code}`标签中包装代码块. (3认同)