基于Data.Typeable 強制轉換和 Haskell 中的 Maybe 模式匹配行為
我有
- 一個結構:
data S a = S {val :: IO a} - 一個結構:
S (Maybe a)) - 一個結構:
IO (S (Maybe a))) - 一個功能:
Maybe a -> IO (S (Maybe a))
那么,基本上需要一個函式
_map :: (Maybe a -> IO (S (Maybe a))) -> S (Maybe a) -> IO (S (Maybe b))
這個問題的代碼非常簡化,出于我的目的,有這樣的結構和功能是有原因的。例如,S {val :: IO a}實際上持有一個欄位值,Data.Vector.Mutable這就是型別為IO a.
基本概念只是值上的映射/功能應用。
在 is 的情況下Maybe a,Nothing我希望代碼沒有任何行為IO并回傳IO (S (Nothing))。
data S a = S
{ val :: IO a
}
_val :: S (Maybe a) -> IO (Maybe a)
_val = \sMaybeA -> val sMaybeA
_map :: (Maybe a -> IO (S (Maybe b))) -> S (Maybe a) -> IO (S (Maybe b))
_map = \f -> \sMaybeA -> do
val <- sMaybeA |> _val
sMaybeB <- val >>= f
-- Expected type: IO (S (Maybe a))
-- Actual type: Maybe (S (Maybe a))
pure sMaybeB
-- another obvious error because sMaybeB has the error
當然,錯誤很明顯,所以我理解這是如何發生的,這不是這個問題的范圍。
我根本不知道如何使用IOand的混合結構來完成預期的型別Maybe。你怎么能解決這個問題?
uj5u.com熱心網友回復:
我覺得您對 Haskell 型別系統的擔憂源于您在此處展示的誤導性 API 設計。您正在嘗試嵌套型別而不是組合它們。我相信,在撰寫 Haskell 時,您會發現 Haskell 型別之間的組合非常好。您不必回退到幼稚但丑陋的嵌套。
像這樣的東西呢?
newtype S a = S { val :: IO (Maybe a) }
instance Functor S where
fmap f = S . fmap (fmap f) . val
instance Applicative S where
pure = S . pure . pure
S f <*> S v = S $ liftA2 (<*>) f v
instance Monad S where
S ma >>= f = S $ do
maybex <- ma
case maybex of
Nothing -> pure Nothing
Just a -> val $ f a
weirdMap :: (a -> S b) -> S a -> S b
weirdMap f sa = do
value <- sa
f value
沒有嵌套IO,因為你永遠不需要嵌套IO(除非你正在使用STM)。您可以簡單地組合您IO的 s,無論其中一個是否僅用于可變陣列。
我還冒昧地嵌入了Maybe ainside S,因為這似乎就是您的 API 所做的。但是,您很可能將其取出并繼續處理Functor//實體Applicative,Monad并繼續保持平坦的IO層次結構。
uj5u.com熱心網友回復:
我不確定您要達到的目標。你嵌套IO在另一個IO(又名S)中的方式有??點奇怪。
此外,您的型別_map只允許普通居民:
_map :: (Maybe a -> IO (S (Maybe a))) -> S (Maybe a) -> IO (S (Maybe b))
注意b最后的。沒有辦法b從引數中獲得這樣的 a ,迫使代碼始終使用Nothing :: Maybe b,適當地包裝。我想這不是你想要做的。
我把b改成了a. 然后我們可以測驗結果sMaybeA并采取相應措施。
_map :: (Maybe a -> IO (S (Maybe a))) -> S (Maybe a) -> IO (S (Maybe a))
_map f sMaybeA = do
v <- val sMaybeA
case v of
Nothing -> return (S (return Nothing))
Just _ -> f v
請注意,雖然它可以編譯,但它可能與您實際需要的不同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/434051.html
標籤:haskell
上一篇:Haskell中的種類級別身份
