Я сделал функцию в haskell, которая должна взять список вместе с размером списка; и предполагается создать Data.Vector.Mutable.MVector с заданным размером, заполнить вектор содержимым списка и вернуть этот вектор.Подписи типа Haskell и Monads
TL; DR
- Я хочу знать, почему тип подписи я поставляется не работает. Что мне не хватает в этом, что делает его неприемлемым как подпись типа?
- Возможно ли создать функцию, выполняющую то, что я указал выше, при использовании моей подписи типа?
- Как интерпретировать подпись типа, сгенерированную компилятором, на основе кода, который я написал?
Это функция:
vecFromList lst sz = MV.new sz >>= (\vec -> fillV (zip [0..sz - 1] lst) vec) where
fillV [] vec = vec
fillV ((i, v):xs) vec = MV.write vec i v >> fillV xs vec
Большинство из них я написал на самом деле не пытаясь понять, что они делают (последняя строка) и, как следствие, я не могу придумать с подходящей подписью типа. Однако компилятор вмешалась, чтобы сохранить день с этим:
компилятором сигнатуру
vecFromList
:: (PrimMonad (MVector t), PrimState (MVector t) ~ t) =>
[b] -> Int -> MVector t b
Я слышал, кто-то сказал Wat? О, только я, в любом случае ... Прежде чем я пытался компилировать его, это тип подписи я думал, что должно работать:
Один я думал, что должен работать
vecFromList :: PrimMonad m => [t] -> Int -> MV.MVector (PrimState m) t
Это должно быть очевидно, к этому моменту, что эта несколько упрощенно выглядящая сигнатура типа, которая, похоже, выглядит точно так же, как то, что я хочу, чтобы функция выполняла, на самом деле не работы. Чтобы придумать типа подписи, я использовал подпись типа некоторых других функций в векторном модуле, что я думал, были похожи на него, как этот, например:
Data.Vector.Mutable.read
:: PrimMonad m => MVector (PrimState m) a -> Int -> m a
Теперь я по-прежнему относительно новый для haskell, поэтому я все еще пытаюсь привыкнуть к символам и знакам, используемым на этом языке, и особенно близко к пониманию, почему то, что кажется простым заданием, должно стать таким запутанным из-за Monands. Например, какова цель MVector
, имеющая такой вид MVector :: * -> * -> *:
??
Возможно, вы имели в виду 'forM_', а не' for_'? Спасибо – smac89
@ Smac89 ['for_'] (https://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Foldable.html#v:for_) и [' forM_'] (https://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Foldable.html#v:forM_) по существу то же самое, 'for_' просто имеет более слабое (' Аппликативное') ограничение. – cchalmers