ReaderT Env Maybe Val (2)
其實已經不符合標題了,因為現在是:
ReaderT Env (Either String) Val
XD
異常順利,順利到甚至懷疑是不是有哪裡錯了?
稍微玩了一下 Error monad, 照 jinjing 的建議直接看 mtl,
整個 Error.hs 裡面除了 Error class 沒有外,
全部都在裡面了。包括 Error monad (其實是 Either monad 吧??),
ErrorT, 還有各個 functor, monad 等等的實作..
其實還沒看細節。不過大概看了看定義可以想像他是想怎麼運作的。
像是 fail 和 throwError 長好像,都是用 Left 去建立 value?
試寫:
runErrorT $ catchError
(throwError "456" :: ErrorT String Maybe Int)
(return . read)
這邊 throwError 換成 fail 好像也是 Just (Right 456)
(呃,忽然發覺,明明 ReaderT 是 m 在裡面,
怎麼 ErrorT 的 m 卻放外面?為了 IO 嗎?)
* * *
正式開始把 Maybe 換成 Either String 後,只改了以下,
當然是 eval (Var name) = do 的部份:
mval <- asks (lookup name)
case mval of
Nothing -> throwError ("Var " ++ name ++ " not found.")
Just val -> return val
寫完之後在 ghci 裡輸入 :r
居然就過了。我從來沒想過能夠一次就過 @@"
尤其是只改 eval (Var name) 而已,其他都沒動。全文
1. Haskell 真的厲害
2. 好像對 monad 敏感度高很多了?雖然迷迷糊糊,但猜得到結果。
像在變魔術?我想先像這樣知道設計原因,再去摸索細節會容易得多。
3. 不懂細節,好像也能寫,type 錯就調整一下即可...
不過我還是不太懂 monad transformer 是大 hack,
是什麼意思?因為他是一種自動化的機械操作嗎?
如果是這樣的話,monad 本身難道沒有這樣的味道嗎..?
我想可能還要更多經驗才能稍有體會吧..?
下一步就是正式加入 IO 了,看能不能任意插入 putStrLn.
剛剛試 lift 和 liftIO 還是一直錯,不知道原因 XD
==
寫到一半時抓了一下背,結果整個背居然抽痛了一陣子,
差點趴在鍵盤上了 orz 這叫營養不良嗎? XD
0 retries:
Post a Comment
Note: Only a member of this blog may post a comment.