Если GHC может сделать вывод (через FunDep), что c должно быть Term Int для = undefined
blockquote>Не может. Если вы попытаетесь
undefined :: Term Int
, вы получите ту же ошибку переменной жесткого типа. Если вы используете типизированное отверстие= _undefined
, вы увидите, что оно выводитundefined :: c
. Я не знаю почему, но функциональная зависимость, кажется, используется только при примененииeval
кLit
, а не при его определении.Как насчет этого?
class IsTerm a where type TermType a :: * instance IsTerm Lit where type TermType Lit = Int instance IsTerm a => IsTerm (Inc a) where type TermType (Inc a) = TermType a class IsTerm a => Eval a where eval :: a -> Term (TermType a) instance Eval Lit where eval (Lit i) = ToTerm i -- needs UndecidableInstances instance (Eval a, Num (TermType a)) => Eval (Inc a) where eval (Inc i) = ToTerm (fromTerm (eval i) + 1)
Другое соображение - это файл, который записывается один раз или часто. Если вы часто пишете этот файл, то, возможно, вы захотите его кэшировать, поэтому Response.BinaryWrite
наиболее целесообразен.
Если у вас он есть в памяти, я бы не записал его в файловую систему. и используйте Response.WriteFile
.
Response.TransmitFile предпочтительнее, если у вас есть файл на диске и вы используете как минимум asp.net 2.0.
Response.WriteFile считывает весь файл в память, а затем записывает файл в ответ. TransmitFile «Записывает указанный файл напрямую в поток вывода ответа HTTP без буферизации его в памяти.»