Ben continuations üzerinde gidiyorum ve yapılandırma devam türleri için iki farklı yaklaşımlar rastlamak ettik: Ben ikinci yaklaşım gelmez anlıyoruzYapılandırma türleri mi?
type C r a = (a -> r) -> r
exampleFunction :: String -> C Bool String
exampleFunction s = \t -> if length s > 10 then t s else False
...
: Poor Mans Concurrency yer alan yaklaşıma karşı
newtype C r a = C {runC :: (a -> r) -> r}
exampleFunction :: String -> C Bool String
exampleFunction s = C $ \t -> if length s > 10 then t s else False
continuationFunction :: String -> Bool
continuationFunction s = True
main = do
let suspendedFunc = exampleFunction "testing"
let completedFunc = runC suspendedFunc $ continuationFunction
Açık bir veri kurucusu kullanmayın.
- Bu yaklaşımların pratik farklılıkları nelerdir?
Bunu genel bir türden bir monad ile kullanmayı denediğimde etkilenir mi? Mesela:
data Hole = Hole1 Int | Hole2 String type C r m a = (a -> m r) -> m r exampleFunction :: String -> C Bool Maybe Hole exampleFunction s = \t -> do x <- t (Hole1 11) y <- t (Hole2 "test") ... continuationFunction :: Hole -> Bool continuationFunction (Hole1 x) = False continuationFunction (Hole2 y) = True
Farklılıklar, "type" ve "newtype" arasındaki normal farklardır. 'type' eşanlamlıları, varolan bir tür için yeni bir addır; Kısmen uygulanamazlar ve onları bir sınıfın 'örneği' yapamazsınız. 'newtype'lar, sarmaladıkları türlerden ayrıdır ve bunları özel' instance' yazacak şekilde kullanabilirsiniz. Örneğin, “C” tipi için “Monad” örneğini yazmakta sorun yaşarsınız. –
Teşekkürler @BenjaminHodgson - Bir cevap vermek istiyor musunuz ve kabul edeyim? –