[英]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 String
和String -> IO ()
函數(整個putStr . toString . toMatrix
表達式具有該類型)。 這正是>>=
需要的,所以你已經完成了設置。
如果您希望代碼具有與上面相同的順序,則可以使用向后綁定運算符:
fileReading file = putStr . toString . toMatrix =<< readFile file
有些人發現這個版本更具可讀性,因為所有代碼都“流向”同一個方向。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.