Вы можете сделать это, но вам нужно сделать немного хитрости:
newtype Fix f = In{out:: f (Fix f)}
Вы можете определить Cata впоследствии:
Cata :: (Functor f) => (f a -> a) -> Fix f -> a
Cata f = f.(fmap (cata f)).out
Это определит общий катаморфизм для всех функторы, которые вы можете использовать для создания своих собственных вещей. Пример:
data ListFix a b = Nil | Cons a b
data List a = Fix (ListFix a)
instance functor (ListFix a) where
fmap f Nil = Nil
fmap f (Cons a lst) = Cons a (f lst)
Здесь находится документация для конструктора MemoryStream (byte [])
, который вы используете. В нем конкретно говорится:
Этот конструктор не раскрывает базовый поток. GetBuffer выдает исключение UnauthorizedAccessException.
Вместо этого следует использовать this конструктор с publiclyVisible = true
.
Чтобы добавить к тому, что другие уже добавили сюда ...
Другой способ заставить ваш код работать - это изменить ваш код на следующую строку.
byte[] buf2 = ms.ToArray();
Похоже, вы используете MemoryStream (array [])
, который не соответствует ни одной из трех версий, упомянутых в документации. .
Проверьте документы для MemoryStream.GetBuffer ()
Чтобы создать экземпляр MemoryStream с публично видимый буфер, используйте MemoryStream, MemoryStream (Byte [], Int32, Int32, Boolean, Boolean) или MemoryStream (Int32). Если нынешний размер потока можно изменять, два вызова этого не возвращают тот же массив, если размер базового байтового массива изменяется между звонками. Для дополнительных информацию см. в разделе Емкость.
Необходимо использовать другой конструктор.