从Haskell中的字符串构建特定的字符串列表

时间:2018-05-05 22:50:20

标签: haskell functional-programming

我开始学习haskell而且我遇到了问题。

我从标准输入中读取了"1234""azer"这样的字符串 我想制作一个类似["123", "234", "341", "412"]["aze", "zer", "era", "raz"]的列表。

我可能必须使用map,但我不知道如何继续。 有人可以帮助我这样做吗?感谢

2 个答案:

答案 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>