2016-03-27 23 views
2

Haskell Programming From First Principles'dan Monad Transformers bölümündeki alıştırmalardan biriyle sorun yaşıyorum. Özellikle, (const (Right (Just 1))) benzer ve şu bitirmek istenir bir yapıya verilir: "o iş yapmak"İç içe bir türü bir monad trafo kümesine dönüştürme

import Control.Monad.Trans.Except 
import Control.Monad.Trans.Maybe 
import Control.Monad.Trans.Reader 

embedded :: MaybeT (ExceptT String (ReaderT() IO)) Int 
embedded = ??? (const (Right (Just 1))) 

Bu talimatlar sadece karşı olmasına rağmen biz, iç içe yapısını değiştirmek anlamına gelir varsayalım

Sıkıştığımdan önce birkaç yoldan geçtim. Şimdiye kadar, topladığımdan, monad transformatörleri en sık olarak lift s ve do s - SO & As, Diehl summarizes pretty well here'un bir birleşimi ile oluşturulur.

transformers Kitaplıklarındaki map<Monad>T arasındaki çeşitli ilginç/eğlenceli sonuçlara ulaşmak için çalışıyordum ancak özgün sorunu nasıl çözeceğimizi bulamıyorum. Herhangi bir ipucu takdir edilecektir - ancak, bir çözüm gönderirseniz, please use the spoiler markup (Puzzling'in dışında herhangi bir yerde kullanılmamış olmasına rağmen).

cevap

3

Bu alıştırma, monad transformatörlerinin bazen "içeriden dışarı" nasıl çalıştıklarını gösterir. Eğer Sonra MaybeT nasıl anlamaya tip

ReaderT() IO (Either String (Maybe Int)) 

ait bir şey olsun ki ifadeyi tamamlamayı nasıl bulmaktan başlayın. Vb

ReaderT, EitherT ve MaybeT veri yapıcılarını kullanmanıza izin verildiğini unutmayın!

Bu, henüz yapmadıysanız GHC'nin yazılan deliklerini denemek için harika bir zaman olacaktır.

+1

Gah - ve öyle olduğunu düşündüğüm kadar basit. İpuçları için teşekkürler! – stites

+0

@stites, sorun değil! – dfeuer

İlgili konular