运行haskell程序时获取<< loop >>消息

Pep*_*nds 1 haskell

我写了这样的代码

import System.Environment
import Control.Exception
import Data.List

f :: String -> [String] -> IO ()
f str []       =
    putStrLn "String 2"
f str (x : xs) =
    putStrLn "String 1"

main :: IO ()
main = do
    xs <- getArgs
    let str = head xs
    let xs = tail xs
    f str xs
    return ()
Run Code Online (Sandbox Code Playgroud)

但是当我编译并尝试运行时,我总是只能回答 <<loop>>

ghc run.hs
./run some_string some_over_arguments
run: <<loop>>
Run Code Online (Sandbox Code Playgroud)

这段代码出了什么问题?我试着用hoogle <<loop>>但没有发现任何东西.如果我传递给f不,str xsstr [some_hardcoded_list]这段代码工作正常,所以我猜这有点不对劲xs.

Car*_*ten 6

你看到你声明的部分

let xs = tail xs
Run Code Online (Sandbox Code Playgroud)

这表示你想xs成为一个列表,它本身尾部,这会导致一个infinte循环(ghc似乎注意到;))(看作每个常量列表的定义repeat c就足够了 - 技术上当然你只是得到一个简单的无限-环)

所以只需将其改为类似的东西

main :: IO ()
main = do
    xs <- getArgs
    let str = head xs
    let xs' = tail xs
    f str xs'
    return ()
Run Code Online (Sandbox Code Playgroud)

并且您的代码应该按预期工作;)