我有有限矢量的數據系列:我可以在運行時檢查實例存在嗎?
data family Vec (n :: Nat) e
data instance Vec 2 Float = Vec2f !Float !Float
data instance Vec 3 Float = Vec3f !Float !Float !Float
-- and so on
我也有一個家庭的吸氣劑的功能:
class Get (i :: Nat) (n :: Nat) e where
get :: Vec n e -> e
instance Get 0 2 Float where
get (Vec2f x _) = x
instance Get 1 2 Float where
get (Vec2f _ x) = x
instance Get 0 3 Float where
get (Vec3f x _ _) = x
instance Get 1 3 Float where
get (Vec3f _ x _) = x
instance Get 2 3 Float where
get (Vec3f _ _ x) = x
-- and so on
這種方式,獲得了矢量的元素在編譯時被檢查,所以這編譯:
get @0 (Vec2f 0 1)
,這並不:
get @4 (Vec2f 0 1)
現在,我不知道是否可以使用這些函數編寫運行時範圍檢查。 我嘗試這樣做:
get' :: forall n e. (KnownNat n) => Integer -> Vec n e -> Maybe e
get' i v =
if i >= 0 && i < natVal (Proxy :: Proxy n)
then (flip fmap) (someNatVal i) $ \(SomeNat (Proxy :: Proxy i)) ->
get @i v -- Could not deduce (Get i n e)
else Nothing
我想我必須在運行時檢查Get i n e
實例的存在,是有辦法做到這一點?
最後一行'return(get p v)'中的'p'是什麼?你的意思是'iProx'? –
@AlexeyVagarenko是的,對不起!在編輯過程中更改變量的名稱,並忘記交換該實例。 –