cor*_*ium 0 haskell tuples list
我想将转换列表[[1,2,3],[2,3]]转换为元组[(1,2,3),(2,3)]
我的功能:
thr [a,b,c] = (a,b,c)
tupel [] = []
tupel (x:xs) = if length x==3 then thr x:(tupel xs) else (tupel xs)
Run Code Online (Sandbox Code Playgroud)
这项工作有三个要素.
thr [a,b,c] = (a,b,c)
two [a,b] = (a,b)
tupel [] = []
tupel (x:xs) = if length x==3 then thr x:(tupel xs) else two x:(tupel xs)
Run Code Online (Sandbox Code Playgroud)
为什么不这样做?
错误:在应用程序中输入错误 *表达式:两个x:tupel2 xs 期限:两个x 类型:(a,a)*不符合:(a,a,a)
好的,让我们跳到最后并启动ghci.有什么类型的[(1,2,3),(1,2)]?
ghci> :t [(1,2,3),(1,2)]
<interactive>:1:10:
Couldn't match expected type `(t0, t1, t2)'
with actual type `(t3, t4)'
In the expression: (1, 2)
In the expression: [(1, 2, 3), (1, 2)]
In an equation for `it': it = [(1, 2, 3), (1, 2)]
Run Code Online (Sandbox Code Playgroud)
那个错误不是因为我输入的数据错了,这是因为[(1,2,3),(1,2)]无效的haskell.
haskell中的列表可以包含无限数量的项目,但需要注意的是所有项目必须属于同一类型.
这似乎不可思议,但(1,2,3)并(1,2)是同一类型的不是.一个是3元组,一个是2元组.
元组与列表相反 - 它只能容纳特定数量的项目,但它们可以是一堆不同的类型.元组类型由它们包含的项目给出的类型序列定义.
因此,3个整数的元组(或者,如ghc将显示的,类似数字的东西)与2个整数的元组不同.我们可以直接使用:tghci中的运算符看到这个:
ghci> :t (1,2,3)
(1,2,3) :: (Num t1, Num t2, Num t) => (t, t1, t2)
ghci> :t (1,2)
(1,2) :: (Num t1, Num t) => (t, t1)
Run Code Online (Sandbox Code Playgroud)
看到它(2,3,4)并且分别(2,3)具有匹配(1,2,3)和类型的类型(1,2):
ghci> :t (2,3,4)
(2,3,4) :: (Num t1, Num t2, Num t) => (t, t1, t2)
ghci> :t (2,3)
(2,3) :: (Num t1, Num t) => (t, t1)
Run Code Online (Sandbox Code Playgroud)
那是因为(2,3,4)并且(1,2,3)是两个具有相同类型的值.对于(1,2)和,情况也是如此(2,3).
所以没有函数转换[[1,2,3],[1,2]]为[(1,2,3),(1,2)]haskell,因为这样的函数的结果不可能进行类型检查.
元组具有不同的类型,因此没有单个(简单)类型可提供给您的tupel函数。
但是,通过退后并使用求和类型,您可以对希望返回的所有变体进行编码:
data T a
= One a
| Two a a
| Three a a a
deriving Show
two :: [a] -> T a
two [a,b] = Two a b
thr :: [a] -> T a
thr [a,b,c] = Three a b c
tuple :: [[a]] -> [T a]
tuple [] = []
tuple ([a,b] :xs) = Two a b : tuple xs
tuple ([a,b,c]:xs) = Three a b c : tuple xs
tuple (_ : xs) = tuple xs
Run Code Online (Sandbox Code Playgroud)
请注意,我们如何通过模式匹配来区分两个元素列表和三个元素列表。
其次,优良作法是为每个函数写下您的期望类型-这将有助于解决设计中的困惑,并迅速揭示逻辑错误,例如两种不同的元组类型。
运行此命令,您可以看到它如何很好地进行分组:
*Main> tuple [[1,2,3],[2,3]]
[Three 1 2 3,Two 2 3]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1047 次 |
| 最近记录: |