Исходя из Haskell, я читал историю Идриса о лени (нестрогости). Я просмотрела последние примечания к выпуску и нашла код, похожий на следующий
myIf : (b : Bool) -> (t : Lazy a) -> (e : Lazy a) -> a
myIf True t e = t
myIf False t e = e
Я написал простую факториальную функцию, чтобы проверить ее.
myFact : Int -> Int
myFact n = myIf (n == 1) 1 (n * myFact (n-1))
Я запустил, и это сработало!
> myFact 5
120 : Int
Я решил сломать его, изменив сигнатуру типа myIf
на
myIf : (b : Bool) -> a -> a -> a
Я перезагрузил idris
repl и снова запустил myFact 5
, ожидая бесконечной рекурсии. К моему удивлению, он все еще работал так же!
Может ли idris понять, когда следует избегать строгости? Почему это не повторилось навсегда?
Я использую Idris 0.9.15, и ни в одном из примечаний к выпуску между этим и связанными примечаниями не упоминаются какие-либо изменения.
myFact
с:x
в REPL или компилирую в исполняемый файл. - person C. Quilley   schedule 02.10.2015