Haskell程序交换两个数字
本教程讨论了在Haskell编程语言中编写交换两个数字的程序。
Haskell中的变量是不可变的,即一旦声明,其值就不能更改。因此,我们无法交换两个变量的值,但可以通过交换列表和元组中的值来模拟此操作。
在本教程中,我们将看到:
- 在二元元组中交换两个数字的程序。
- 在列表中交换两个数字的程序。
在Haskell中,元组用于将不同数据类型的元素存储为集合。元组由两端的括号标识。元组仅支持少量函数。多个元组不能组合或合并。例如,一个元组看起来像(“john”,24)。
二元元组是只有两个元素的元组。
在Haskell中,列表是一种用于存储相同数据类型元素列表的数据结构。
列表由两端的方括号标识。列表在Haskell中支持许多函数。多个列表可以组合成一个新列表。例如,一个列表看起来像[1,3,2]是数字列表。
算法步骤
- 初始化列表或元组。
- 实现程序逻辑以交换列表或元组中的两个数字。
- 打印结果列表或元组。
示例1
在二元元组中交换两个数字的程序。
-- function definition swap (a,b) = (b,a) main :: IO() main = do -- declaring and initializing tuple let tup = (21,"john") -- invoking the function swap let revtup = swap tup -- printing the reversed tuple print ("The resultant tuple after the swap is:") print (revtup)
输出
"The resultant tuple after the swap is:" ("john",21)
在上面的程序中,我们定义了一个名为swap的函数,它接受两个参数作为元组a,b,并且该函数通过交换其位置返回二元元组。此函数接受二元元组作为参数,并通过交换元素返回一个元组。在主函数中,我们用整数21和字符串“john”初始化了一个元组。我们使用此初始化的元组作为参数调用了swap函数,并将返回的输出加载到变量revtup中。最后,使用print函数打印交换后的结果元组。
示例2
在列表中交换两个数字的程序
swapHelper :: [Int]->Int->Int->[Int] -- function definition swapHelper xs a b = swap xs a b (xs!!a) (xs!!b) -- function declaration swap :: [Int]->Int->Int->Int->Int->[Int] -- function definition swap [] a b e1 e2 = [] swap (x:xs) a b e1 e2 = if(a==0) then [e2] ++ (swap xs (a-1) (b-1) e1 e2) else if (b==0) then [e1] ++ (swap xs (a-1) (b-1) e1 e2) else [x] ++ (swap xs (a-1) (b-1) e1 e2) main :: IO() main = do -- declaring and initializing list indices let list = [1,2,3,4] let a = 0 let b = 1 -- invoking the function swapHelper let revlist = swapHelper list 0 1 -- printing the resultant list print ("The resultant list after swapping elements at indices " ++ show a ++ "," ++ show b ++ " in the list " ++ show list ++ " is:" ) print (revlist)
输出
"The resultant list after swapping elements at indices 0,1 in the list [1,2,3,4] is:" [2,1,3,4]
在上面的程序中:
我们声明了一个名为swaphelper的函数,它接受整数列表和两个整数参数,并返回整数列表。在其函数定义中,该函数接受整数列表xs和两个整数a和b作为参数。swap函数被调用,参数为xs、a、b,以及xs中位于整数列表xs索引a和b处的元素。
列表中索引处的元素可以使用中缀函数“!!”检索。语法为LIST !! INDEX。例如,此代码xs!!2返回列表xs中索引2处的元素。
我们声明了一个名为swap的函数,它接受整数列表作为参数,四个整数参数,并返回整数列表。在其函数定义中,它使用模式匹配通过将列表解构为(x:xs)来接受整数列表xs的参数,其中x是列表中的第一个元素,xs是列表的其余部分。它接受四个整数参数a、b、e1和e2。其中a和b是要替换元素的索引。e1和e2是要替换元素的实际值。
在函数中,检查a的值,如果a的值为零,则控制权转移到then块,其中该函数递归调用自身,参数为剩余列表xs、a-1、b-1、e1和e2,并在前面连接单个整数列表[e2]。如果a的值不等于零,则控制权转移到else块,其中检查b的值。
如果b的值为零,则控制权转移到then块,其中该函数递归调用自身,参数为剩余列表xs、a-1、b-1、e1和e2,并连接单个整数列表[e1]。
如果b的值不等于零,则控制权转移到else块,其中该函数递归调用自身,参数为剩余列表xs、a-1、b-1、e1和e2,并连接单个整数列表[x]。其中x是列表参数中的第一个元素。
swap函数反转给定索引处列表中的元素。其中swapHelper是一个辅助函数,用于查找这些索引处的元素并调用swap函数。
在主函数中,整数列表用索引变量a和b初始化。调用swap helper函数,并将返回的输出加载到变量revlist中。最后,使用print函数打印结果列表。
结论
在本教程中,我们讨论了在Haskell编程语言中实现一个程序来交换列表和二元元组中的元素。