簡體   English   中英

將monad綁定到復合材料(Haskell)

[英]Binding monads into composites (Haskell)

美好的一天。 我正在尋求對monads的一些澄清,並使用bind(在進入復合材料時. )請。

所以對於這個例子:

--Monadic parts:
readFile :: String -> IO File
putStr :: String -> IO()
-- Non monadic parts
toMatrix :: String -> CustomMatrix
toString :: CustomMatrix -> String

基本上我懶得讀取文件( readFile )然后生成自定義矩陣,將矩陣轉換為字符串輸出。 然后回來。

fileReading :: String -> IO
fileReading file = putStr(toString . toMatrix . readFile file)

這是我開始使用bind >>=readFile file創建一個混亂。 有沒有辦法繼續使用復合材料. 綁定和組合而不會造成難以理解的混亂(不是我真正的目標)。

一如既往,感謝任何幫助。 謝謝大家。

在這個例子中,如果不使用一些 monadic函數(如>>= ),就無法逃脫。 如果您真的想要最終執行某些IO,則不能將正常的函數組合與IO值一起使用。

令人高興的是,您仍然可以相當容易地編寫代碼:

fileReading file = readFile file >>= putStr . toString . toMatrix

這是因為這兩個. 操作將兩個非IO功能與最終IO功能相結合。 此時,您有兩個IO值: IO StringString -> IO ()函數(整個putStr . toString . toMatrix表達式具有該類型)。 這正是>>=需要的,所以你已經完成了設置。

如果您希望代碼具有與上面相同的順序,則可以使用向后綁定運算符:

fileReading file = putStr . toString . toMatrix =<< readFile file

有些人發現這個版本更具可讀性,因為所有代碼都“流向”同一個方向。

暫無
暫無

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

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