1

Haskell に転置関数または ZipList 関数がある可能性があることは理解していますが、同じ長さmのn 個のリストを取り、それらを長さnのm個のリストに転置する独自の転置関数を作成しようとしています。

これまでのところ、関数は次のコードでほぼ機能しています。

list = [[1,2,3],[4,5,6],[7,8,9]]

head' (x:xs) = x

head'' [] = []
head'' (xs:lxs) = head' xs:head'' lxs

tail' [] = []
tail' (x:xs) = xs

tail'' [] = []
tail'' (xs:lxs) = tail' xs:tail'' lxs

merge (xs:lxs) = (head' xs:head'' lxs):(merge (tail' xs:tail'' lxs))

merge list> ghciで実行すると、次の出力が得られます。

[[1,4,7],[2,5,8],[3,6,9],[*** Exception: list2.hs:16:1-16: Non-exhaustive patterns in function head'

head'これは、関数の空のリストの基本ケースが欠落していることを意味していると確信しています。リストは転置されますが、閉じられません。この場合、その問題にどのように対処しますか?と関係があるのではないかと思いますがMaybe、そのように実装するのに苦労しています。

4

2 に答える 2

0

maphead既存のandtail関数に加えて、必要なのはそれだけです。簡単にするために、これは入力が常に空でないリストであることを前提としています (つまり、 でxsある可能性がありますが[[],[],[]]、決して単独ではないため、 or[]を使用しても問題はありません)。headtail

> map head list
[1,4,7]
> map tail list
[[2,3],[5,6],[8,9]]
> let foo xs = if null (head xs) then [] else map head xs : foo (map tail xs)
> foo list
[[1,4,7],[2,5,8],[3,6,9]]
于 2019-01-04T14:14:22.980 に答える