我开始学习haskell而且我遇到了问题。
我从标准输入中读取了"1234"
或"azer"
这样的字符串
我想制作一个类似["123", "234", "341", "412"]
或["aze", "zer", "era", "raz"]
的列表。
我可能必须使用map
,但我不知道如何继续。
有人可以帮助我这样做吗?感谢
答案 0 :(得分:2)
让我们从列表[1..4]
开始。让我们重复它永恒:
>>> cycle [1..4]
[1,2,3,4,1,2,3,4,1,2,3,4,...
现在让我们分一杯,比如第二个指数:
>>> take 4 $ drop (2-1) $ cycle [1..4]
[2,3,4,1]
我们可以通过命名函数来概括:
slice n = take 4 $ drop n $ cycle [1..4]
为了获得所有可能的循环排列,我们只需要从1到4采样n:
>>> map slice [1..4]
[[2,3,4,1],[3,4,1,2],[4,1,2,3],[1,2,3,4]]
现在,我们如何使用任意字符串进行此操作?让我们重新定义切片以接受一个字符串:
slice s n = take (length s) $ drop n $ cycle s
因此我们的循环排列函数可以定义如下:
cyclicPerms s = map (slice s) [1..(length s)]
测试:
>>> cyclicPerms "abcde"
["bcdea","cdeab","deabc","eabcd","abcde"]
答案 1 :(得分:0)
我最初发布的答案完全误解了规范。我,就像Haskell枚举一样,只读取前两个数字,所以我认为它继续这样。哎呀。无论如何,我只是调整了我写的cychnks n ls = [take n.drop x$ls2|(x,y) <-zip [0..] ls]
where ls2 = ls++ls
cychnks 5 "abcde"
函数来产生重复。当我回到家时,我想我还有另一个循环列表。如果它不相同,我也会发布它。谁知道呢。
此功能允许您指定块大小以及列表。
cychnks 3 "abcde"
[&#34; ABCDE&#34;&#34; BCDEA&#34;&#34; cdeab&#34;&#34; DEABC&#34;&#34; EABCD&#34;] < / p>
UserRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.hasChild("username")){
String Username = dataSnapshot.child("username").getValue().toString();
username.setText(Username);
}
if (dataSnapshot.hasChild("profileimage")){
String image = dataSnapshot.child("profileimage").getValue().toString();
Picasso.get().load(image).placeholder(R.drawable.user_circle2).into(profileImage);
}
}
[&#34; ABC&#34;&#34; BCD&#34;&#34; CDE&#34;&#34; DEA&#34;&#34; EAB&#34;] < / p>