[英]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.