Tôi đang gặp phải một số rắc rối thực sự khi thiết kế chức năng của chức năng sequence
của Haskell, mà Hoogle nói với tôi chưa tồn tại. Đây là cách ứng xử:Chức năng Unadence Monad trong Haskell
ghci> sequence [Just 7, Just 8, Just 9]
Just [7,8,9]
ghci> sequence [getLine, getLine, getLine]
hey
there
stack exchange
["hey","there","stack exchange"] :: IO [String]
Vấn đề của tôi là thực hiện một chức năng như thế này:
unsequence :: (Monad m) => m [a] -> [m a]
Vì vậy mà nó cư xử như thế này:
ghci> unsequence (Just [7, 8, 9])
[Just 7, Just 8, Just 9]
ghci> sequence getLine
hey
['h','e','y'] :: [IO Char] --(This would actually cause an error, but hey-ho.)
tôi không thực sự biết nếu điều đó là có thể, bởi vì tôi muốn thoát khỏi cái đơn tại một thời điểm nào đó, nhưng tôi đã bắt đầu, mặc dù tôi không biết cách đặt điểm ngắt cho hàm đệ quy này:
unsequence m = (m >>= return . head) : unsequence (m >>= return . tail)
Tôi nhận thấy rằng tôi cần điểm ngắt khi m
ở đây bằng return []
, nhưng không phải tất cả các đơn vị đều có Eq
trường hợp, vậy làm cách nào tôi có thể thực hiện việc này? Điều này thậm chí có thể? Nếu vậy, tại sao và tại sao không? Xin hãy nói với tôi điều đó.
Để xem tại sao nó không thể được thực hiện nói chung, hãy xem xét một cái gì đó như 'do {b <- check; nếu b thì list1 else list2} :: M [A] 'đối với một số đơn vị cụ thể' M' và một số loại bê tông 'A'. – Cactus