源材料

此外,源材料

如果您通过跳过一个字母来阅读 Alola Rocon...

>>> “阿罗拉罗康”[::2]
'亚伦'

— 与 Hiroki Kiyohara @Shodo (@hirokiky) 一起进行 AI 校对2022 年 7 月 27 日

我最近一直在学习 Haskell 语法,这似乎是一个非常好的练习主题,所以我决定尝试一下。

执行

跳过字符.hs
import Debug.Trace
main = do cs <- getContents
          print $ map (\(n, c) -> c) $ filter (\(n, c) -> if (n `mod` 2) == 1 then True else False) $ zip [1..] $ cs
$ echo "アローラロコン" | stack runghc skipchar.hs
"アーロン"

细节

如果你写得很详细,它将如下所示。

跳过字符.hs
import Text.Show.Unicode
main = do cs <- getContents
          uprint $ skipchar $ cs

skipchar :: [Char] -> [Char]
skipchar cs = removeIndexes $ filterOddIndexes $ addIndexes $ cs

addIndexes :: [Char] -> [(Int, Char)]
addIndexes cs = zip [1..] cs

removeIndexes :: [(Int, Char)] -> [Char]  
removeIndexes cs = map removeIndex cs

removeIndex :: (Int, Char) -> Char  
removeIndex (n, c) = c

filterOddIndexes :: [(Int, Char)] -> [(Int, Char)]
filterOddIndexes ts = filter isIndexOdd ts

isIndexOdd :: (Int, Char) -> Bool
isIndexOdd (n, c) = if (n `mod` 2) == 1 then True else False
    

通过将输入的 Char 类型数组转换为 (Int, Char) 类型数组,可以确定哪个字符是偶数。

  ['ア', 'ロ', 'ー', 'ラ'., ...]
→ [(1, 'ア'), (2, 'ロ'), (3, 'ー'), (4, 'ラ'), ...]

这是我直观想出的方法,但似乎有一种更简单的书写方式,不涉及分配数字。
但是,我谈到了无限列表和惰性求值,它们是类似 Haskell 的操作,所以我认为结果还可以(?)

想法

输出片假名而不是处理本身花费了很多时间。
(我想安装一个叫做 Stack 的东西来使用一个处理 Unicode 的库,但它不能很好地与 WSL 一起工作并转移到 Mac)

我在学习Haskell本身方面取得了一些进展,我又开始迷茫了,所以我希望我能继续慢慢进步。

非常感谢。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308622831.html

相关文章: