我正在复习过去的考试,为即将到来的考试做准备,在完成几个问题后,我遇到了一个我无法解决的问题。
它需要一个函数,该函数将接受一个字符串(或 [Char])并返回字符串中英语单词数量的 Int。它说 isWord 是一个假设函数,它接受一个字符串并根据该单词是真还是假返回一个 bool 值。 单词必须从左到右排成一行。给出的例子是“catalogre”。所以“cat”、“at”、“catalog”、“ogre”和“log”,函数应该返回5。
wordsInString :: [Char] -> Int
wordsInString [] = 0
wordsInString x
| isWord (take 1 x)
| isWord (take 2 x)
保险杠只是显示了我的想法,显然它不会起作用。
这就是我开始的方式,我想我可以使用 take
函数并一次递增每个字母,然后将起始字母向下移动直到 []
,但我不确定如何正确实现该递归。如果有人有任何想法或可以向我展示一种方法,那就太好了。
最佳答案
如果您知道如何区分单词和非单词,您可以使用 inits
和 tails
获取所有可能的候选人列表:
> :m +Data.List
> concatMap inits $ tails "catalogre"
["","c","ca","cat","cata","catal","catalo","catalog","catalogr","catalogre","","a","at","ata","atal","atalo","atalog","atalogr","atalogre","","t","ta","tal","talo","talog","talogr","talogre","","a","al","alo","alog","alogr","alogre","","l","lo","log","logr","logre","","o","og","ogr","ogre","","g","gr","gre","","r","re","","e",""]
关于haskell - Haskell 中的字数统计程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10224199/