我如何在haskell中解决这个问题?

tbo*_*otl -3 haskell

我得到了这个代码来制作转置矩阵,但它不能100%正常工作.

type Mat a = [[a]]

transpose' :: Eq a => Mat a -> Mat a
transpose' [] = []
transpose' (h:t) = primelem (h:t):transpose' (eliminate' (h:t))

primelem :: Mat a -> [a]
primelem [] = []
primelem [[x]] = [x] 
primelem ((x:xs):t) = x : primelem t

eliminate' :: Eq a => Mat a -> Mat a
eliminate' [] = []
eliminate' (h:t) = (delete (head h) h):eliminate' t

*Main> transpose' [[1,2,3],[0,4,5],[0,06]]

[[1,0,0],[2,4,6],[3,5*** Exception:(..)Non-exhaustive patterns in function primelem
Run Code Online (Sandbox Code Playgroud)

我想弄明白,但我真的不知道哪个案例丢失了.

chi*_*chi 5

要发现您缺少哪些案例,您应该使用该-Wall标志打开警告,如下面的GHCi会话所示.

> :set -Wall
> type Mat a = [[a]]
> :{
| primelem :: Mat a -> [a]
| primelem [] = []
| primelem [[x]] = [x] 
| primelem ((x:xs):t) = x : primelem t
| :}

<interactive>:5:1: warning: [-Wincomplete-patterns]
    Pattern match(es) are non-exhaustive
    In an equation for ‘primelem’: Patterns not matched: ([]:_)

<interactive>:7:14: warning: [-Wunused-matches]
    Defined but not used: ‘xs’
Run Code Online (Sandbox Code Playgroud)

所以,你缺少的案例是:

primelem ([]:t) = ...
Run Code Online (Sandbox Code Playgroud)

  • @tbotl不,你得到的错误信息说你确实在运行时遇到了这种情况. (2认同)