我写了这样的代码
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 xs但str [some_hardcoded_list]这段代码工作正常,所以我猜这有点不对劲xs.
你看到你声明的部分
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)
并且您的代码应该按预期工作;)