2017-08-27 154 views
4

如何從Shell monad中提取值?Haskell:Turtle:從殼牌獲得返回值

我想排序點菜 bash的&&命令的名單,但我也想提取最終ExitCode值。

說我有下面的代碼:

import   Turtle 

type Commands = [Shell ExitCode] 
run :: (MonadIO io) => Commands -> io ExitCode 
run cs = whatIsThisFunction $ Prelude.foldl (.&&.) (return ExitSuccess) cs 

whatIsThisFunction :: (MonadIO io) => Shell a -> io a 
whatIsThisFunction = undefined 

我想看看我是否能與Control.Foldl實現這一點,但沒有找到一個解決方案。

任何想法?

更一般地,爲什麼不龜提供的功能與這種簽名:

sh' :: MonadIO io => Shell a -> io a 

回答

2

sh' :: MonadIO io => Shell a -> io a是不可能的,因爲Shell a可以從[a](由select :: [a] -> Shell a證明),它可以是空的來構造。

+1

使用'IO',你可以讓它拋出。更好的解決方案:切換到「io(也許a)'。 – Reactormonk

+0

因此,當我被低估時,是因爲答案太短或者包含事實上不正確的信息?我沒有詳細說明該怎麼做,因爲提問者已經證明他們已經知道「Control.Foldl」。因此,我的問題只是爲什麼那個特定的簽名不是圖書館的一部分。 @Reactormonk確實表明我的「不可能」的措辭可能太強大了。我對異常的看法與我對「未定義」的看法沒有多大區別。 – erisco

+0

謝謝erisco,答案很豐富。 –

4

Turtle.Shell爲您提供fold :: MonadIO io => Shell a -> Fold a b -> io bControl.Foldl給你一堆Fold小號之間,其中:last :: Fold a (Maybe a)。你可以結合兩者來提取最後的ExitCode你的命令返回如下所示:

import Control.Monad.IO.Class 
import Turtle.Shell as TS 
import Control.Foldl as CF 

sh' :: MonadIO io => Shell a -> io (Maybe a) 
sh' c = TS.fold c CF.last 
+0

謝謝!我正在尋找這樣的東西! –

+0

順便說一句,它看起來像一個更習慣的方式來處理龜的錯誤是使用異常。然後代碼會更是這樣的: ''' Tt.sh CMDS 'catches' [處理程序(\(E :: Tt.ProcFailed) - > Log.error $顯示E) ,處理程序(\(E :: Tt.ShellFailed) - > Log.error $ show e) , - 等等 ] ''' 你同意嗎? (抱歉代碼佈局不正確,我不知道如何在評論中做到這一點) –