次のコードを提示:私は他のいくつかの方法でこのコードを再書かれているが、イドリスは合計としてそれを認識することができませんこの再帰関数は合計ではありませんか、コンパイラはそれを証明できませんか?それを合計で書き直すには?
TotalityOrWhat.idr:17:3: TotalityOrWhat.parseDriver, parseDriver' is possibly not total due to recursive path TotalityOrWhat.parseDriver, parseDriver' --> TotalityOrWhat.parseDriver, parseDriver' TotalityOrWhat.idr:15:1: TotalityOrWhat.parseDriver is possibly not total due to: TotalityOrWhat.parseDriver, parseDriver'
:
module TotalityOrWhat
%default total
data Instruction = Jump Nat | Return Char | Error
parse : List Char -> Instruction
parse ('j' :: '1' :: _) = Jump 1
parse ('j' :: '2' :: _) = Jump 2
parse ('j' :: '3' :: _) = Jump 3
parse ('r' :: x :: _) = Return x
parse _ = Error
parseDriver : String -> Maybe Char
parseDriver = parseDriver' . unpack where
parseDriver' : List Char -> Maybe Char
parseDriver' xs =
case parse xs of
(Jump j) => parseDriver' $ drop j xs
(Return x) => Just x
Error => Nothing
イドリスはエラーになります。私はそれが完全であることについて間違っているのですか、それともIdrisだけがそれを判断できませんか?本質的に合計であれば、どのように書き直してIdrisがそれを合計として認識するのですか?
'drop j xs'ではなく' drop(j + 1)xs'ですか? –