Cloud Haskell ile oynuyordum. in the hackage documentation fark ettim, bir çeşit uygulama arayüzü var. Ama özellikle ben bulmak veya aşağıdaki imzası ile bir işlev closurePure
yazmaya çalışıyorum:Cloud Haskell - Kapanışlar için "saf" nasıl yazılır?
closurePure :: (Typeable a, Binary a) => a -> Closure a
Bu temelde saf bir kısıtlı versiyonu. Closure
veri türü kendisi soyut iken
aşağıdaki closure
sağlanan:
closure :: Static (ByteString -> a) -> ByteString -> Closure a
Bu yüzden bu kadar alabilirsiniz:
closurePure :: (Typeable a, Binary a) => a -> Closure a
closurePure x = closure ??? (encode x)
sorun ???
ler nerede koymak budur.
myDecode :: (Typeable a, Binary a) => Static (ByteString -> a)
myDecode = staticPtr (static decode)
Ama GHC docs on static pointers okunması üzerine
,show
örnek kısıtlı fonksiyon
Typeable
örneği olmadığı için bir kısıtlaması olamaz bana önerdi:
Benim ilk girişimi izleyen oldu. Bu yüzden etrafında işi denedi Dict
kullanarak önerdi:
myDecode :: Typeable a => Static (Dict (Binary a) -> ByteString -> a)
myDecode = staticPtr (static (\Dict -> decode))
Ama şimdi yukarıda closure
işlevi uymuyor türü yanlış var.
closurePure
veya benzeri bir şey yazmak için var mı (veya Cloud Haskell belgelerinde bunu özledim)? binary
düz tiplerini Closure
s ye yükseltmek, verilen uygulama arabirimini kullanmak için çok önemli görünüyor, ancak nasıl yapılacağını bilemiyorum. Bunu yapabilirim
Not: iyi çalışıyor ama temelde her Binary
örneğin bir örneğini tekrarlamamı gerektirir
class StaticDecode a where
staticPtrDecode :: StaticPtr (ByteString -> a)
instance StaticDecode Int where
staticPtrDecode = static Data.Binary.decode
instance StaticDecode Float where
staticPtrDecode = static Data.Binary.decode
instance StaticDecode Integer where
staticPtrDecode = static Data.Binary.decode
-- More instances etc...
myPure :: forall a. (Typeable a, StaticDecode a, Binary a) => a -> Closure a
myPure x = closure (staticPtr staticPtrDecode) (encode x)
. Dağınık görünüyor ve başka bir yol tercih ederim.
Eminim 'myDecode = staticPtr (statik kod çözme)' çalışmıyor mu? Bana öyle geliyor ki, '' StaticDecode '' kısıtlaması için 'Binary' sınırlamasını işlemiş oldunuz, ancak çalıştığınızı söylüyorsunuz. – 4castle
Üzgünüz, son işlev 'myDecode' değil' myPure' olarak adlandırılmalıdır. Umarım bu daha mantıklıdır. Ama bir anlamda haklısın, ama StaticDecode 'örneğinin içinde durağan (hangi işe yarar) çağıracağımı ancak ilk olarak İkili örnek üzerinden kod çözdüğümde, statik uygulandığında başarısız olur. Tahmin ediyorum (bu tamamen bir tahmindir), her StatikDecode örneği benzersiz bir statik işaretçi üretir, bu yüzden bu iyi çalışır. – Clinton