如何使用来自 Maybe 的数据作为 Vect 大小变量

How to use data from Maybe as Vect size variable

我正在尝试编写一个简单的程序,询问用户列表的大小,并根据用户的输入按索引显示该列表中的内容。但我卡住了。我有一个按数字构建列表的函数。现在我想创建另一个使用 Maybe Nat 作为输入和 returns Maybe (Vect n Nat) 的函数。但我不知道如何做到这一点。这是代码:

module Main

import Data.Fin
import Data.Vect
import Data.String

getList: (n: Nat) -> Vect n Nat
getList Z = []
getList (S k) = (S k) :: getList k 

mbGetList : (Maybe Nat) -> Maybe (Vect n Nat)
mbGetList mbLen = case mbLen of
    Just len => Just (getList len)
    Nothing => Nothing

main : IO ()
main = do 
    len <- readNum
    -- list <- mbGetList len
    putStrLn (show len)

这里是错误:

   |
55 |     Just len => Just (getList len)
   |                       ~~~~~~~~~~~
When checking right hand side of Main.case block in mbGetList at main.idr:54:24-28 with expected type
        Maybe (Vect n Nat)

When checking argument n to function Main.getList:
        Type mismatch between
                n (Inferred value)
        and
                len (Given value)

我试图声明一个隐式变量。代码可以编译,但我不能使用它(至少 throw repl)。另外,我尝试使用依赖对但也失败了。也许我应该使用 Dec 而不是 Maybe?但是怎么办???另一种尝试是尝试使用 map 函数。但在那种情况下,我有这样的错误:Can't infer argument n to Functor.

那么,我错过了什么?

这个答案感觉不是最优的,但这里是

mbGetList : (mbLen: Maybe Nat) -> case mbLen of
  (Just len) => Maybe (Vect len Nat)
  Nothing => Maybe (Vect Z Nat)
mbGetList (Just len) = Just (getList len)
mbGetList Nothing = Nothing

我认为困难在于如果您没有有效的输入

Vect 就没有明确定义的长度