簡體   English   中英

Haskell function型帶IO

[英]Haskell function type with IO

我對 haskell 中的一些東西感到困惑。首先我會清楚地解釋我的問題,

我有從數據庫獲取結果的 function 調用“func1”

類型定義func1:: IO[[String]]

func1 = do
 xx <- main --returns the sql output
 return (map (map fromSql) xx :: [[String]])

我需要編寫兩個函數來給我funcWnt:: IO[[String]] -> [[String]]funcWnt2:: [String] -> Splice m

我在“funcWnt”中嘗試了<- ,但沒有成功。有人能告訴我怎么做嗎?或有其他方法嗎?'funcWnt2:: [String] -> 我已經創建,我想知道' funcWnt' function

謝謝!

作為一般觀察:嘗試始終考慮您的函數對輸入的作用,假設它們已經得到它們。 您的函數似乎既關心獲取輸入又關心轉換它們。 讓他們只是轉換,並使用一些外部 function 來獲取他們的輸入。

讓我們看看我們是否可以采取您的想法,並按照這些新思路重新制定它:

你有:

readDB :: IO [[SqlValue]]
readDB = ... -- not given here

func1 :: IO [[String]]
func1 = do
  xx <- readDB
  return (map (map fromSql) xx)

你現在想寫一些東西來改變它。 一種方法是復制您已經使用過的模式:

funcWnt :: IO [[String]]
  yy <- func1
  return ... -- some transformation of yy

funcWnt2 :: IO (Splice m)
  zz <- funcWnt
  return ... -- some transformation of zz into a Splice m

請注意,以func1的樣式編寫的這些根本不是函數,而是IO中的值。 如果這些函數不做IO ,(而func1當然不做),那么用這種方式編寫是非慣用的、笨拙的、非模塊化的,並將所有純代碼放入IO中。 相反,請考慮純粹編寫它們:

func1 :: [[SqlValue]] -> [[String]]
func1 = map (map fromSql)

funcWnt :: [[String]] -> [[String]]
funcWnt = ... -- some transformation

funcWnt2 :: [[String]] -> Splice m
funcWnt2 = ... -- some transformation into a Splice m

現在您可以輕松地組合它們,並在單個IO值中使用它們:

dbToSplice :: IO (Splice m)
dbToSplice = do
  xx <- readDB
  return $ (funcWnt2 . funcWnt . func1) xx

或者,也許,更慣用(不要害怕>>= ,早點學習):

dbToSplice :: IO (Splice m)
dbToSplice = readDB >>= return . funcWnt2 . funcWnt . func1

現在,如果只是為了爭論, funcWnt2需要在IO中做一些事情。 然后定義看起來像:

funcWnt2 :: [[String]] -> IO (Splice m)
funcWnt2 zz = do
  ... -- compute something with zz
  return ... -- returning some Splice m

dbToSplice :: IO (Splice m)
dbToSplice = readDB >>= funcWnt2 . funcWnt . func1

最后,請注意我在每個頂級 function 上都放置了類型簽名。 你也應該養成這樣做的習慣。 它不僅有助於澄清你的意圖(對你自己、其他開發人員,甚至是一周后的你自己),而且它消除了許多尷尬的類型注釋,比如你必須放在func1中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM