Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中查找字符串的最短和最长单词_Haskell - Fatal编程技术网

在Haskell中查找字符串的最短和最长单词

在Haskell中查找字符串的最短和最长单词,haskell,Haskell,我试图在给定的字符串中找到最短和最长的单词。如果输入的字符串是“house tap mobile telephone”,则最长的单词应该是phone,最短的单词应该是tap。我已经编写了以下函数。如何找到字符串的索引并从中找到最短和最长的单词 ---------Converting string into a list of strings and finding length of each word-------- stringConvert :: String -> [Int] s

我试图在给定的字符串中找到最短和最长的单词。如果输入的字符串是“house tap mobile telephone”,则最长的单词应该是phone,最短的单词应该是tap。我已经编写了以下函数。如何找到字符串的索引并从中找到最短和最长的单词

---------Converting string into a list of strings and finding length of each word--------

stringConvert :: String -> [Int]
stringConvert x = map (length) (words x)

----------Find the longest word-----------

findLongestWord :: String -> Int
findLongestWord x = maximum(stringConvert x)

----------Find the shortest word-----------

findShortestWord :: String -> Int
findShortestWord x = minimum(stringConvert x)

以不同的方式思考这个问题

import Data.Function (on)

stringConvert :: String -> [(String, Int)]
stringConvert s = map (\word -> (word, length word)) (words s)

findLongestWord :: String -> String
findLongestWord s = fst $ maximumBy (compare `on` snd) (stringConvert s)
-- findShortestWord is similar
我假设你只关心索引,这样你就可以用它来查找单词。相反,我用它的长度来表达这个词

如果你真的想知道索引,你会想要

stringConvert :: String -> [((Int, String), Int)]
stringConvert s = zipWith (\index word -> ((index, word), length word)) [0..] (words s)
findLongestWord
的类型将有所不同,但其定义保持不变

编辑:这个技巧被称为,在其他语言中也很有用

第二次编辑:数据。函数应该随编译器一起提供,但在此期间,上的
定义如下:

on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
(.*.) `on` f = \x y -> f x .*. f y

以不同的方式思考这个问题

import Data.Function (on)

stringConvert :: String -> [(String, Int)]
stringConvert s = map (\word -> (word, length word)) (words s)

findLongestWord :: String -> String
findLongestWord s = fst $ maximumBy (compare `on` snd) (stringConvert s)
-- findShortestWord is similar
我假设你只关心索引,这样你就可以用它来查找单词。相反,我用它的长度来表达这个词

如果你真的想知道索引,你会想要

stringConvert :: String -> [((Int, String), Int)]
stringConvert s = zipWith (\index word -> ((index, word), length word)) [0..] (words s)
findLongestWord
的类型将有所不同,但其定义保持不变

编辑:这个技巧被称为,在其他语言中也很有用

第二次编辑:数据。函数应该随编译器一起提供,但在此期间,
上的
定义如下:

on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
(.*.) `on` f = \x y -> f x .*. f y

因为您正在寻找某个单词,所以函数的签名应该是

findLongestWord :: String -> String
findShortestWord :: String -> String
您实现的
stringConvert
函数的想法是正确的,但它有点问题,因为结果不包含与哪个单词和哪个长度相关的信息。将字符串拆分为单词列表与长度计算分开可能更好,并且有一个名为
comparing
的简便函数,它实际上完全不需要
stringConvert
函数

import Data.List (maximumBy)
import Data.Ord (comparing)

findLongestWord :: String -> String
findLongestWord s = maximumBy (comparing length) (words s)
maximumBy
maximum
类似,但它将用于比较两个项目的函数作为第一个参数<代码>比较
是一个高阶函数,可用于将类型为
a->b
的函数(其中
b
是可以比较的类型,即
Ord b=>a->b
(如果您已经熟悉类型约束)转换为两个
a
之间的比较函数(即
a->a->Ordering
类型的函数)


最短的单词也可以用类似的方式找到。

因为您正在寻找某个单词,所以函数的签名应该是

findLongestWord :: String -> String
findShortestWord :: String -> String
您实现的
stringConvert
函数的想法是正确的,但它有点问题,因为结果不包含与哪个单词关联的长度的信息。最好将字符串拆分为单词列表与长度计算分开,还有一个名为
comp的简便函数aring
实际上完全不需要使用
stringConvert
函数

import Data.List (maximumBy)
import Data.Ord (comparing)

findLongestWord :: String -> String
findLongestWord s = maximumBy (comparing length) (words s)
maximumBy
maximum
类似,但它将用于比较两个项目的函数作为第一个参数。
comparing
是一个高阶函数,可用于转换类型为
a->b
(其中,
b
是可以比较的某种类型,即
Ord b=>a->b
(如果您已经熟悉类型约束)到两个
a
之间的比较函数(即
a->a->Ordering
类型的函数)


可以用类似的方式找到最短的单词。

谢谢你的回复。你的方法比我想象的要好得多。我收到一个错误,说“找不到导入的模块数据。函数”如何修复此问题?Data.Function是基本库的一部分,因此您应该安装它。您使用的是GHC还是Hugs?哪个版本?我使用GHC,因此无法帮助您解决库问题,抱歉。请尝试将其作为一个新问题来问。请注意
(\w->(w,length w))
(length>=flip(,)
在pointfree中。@Matvey我发现
(id&&&length)
可读性更强,尽管这两种方法对初学者来说都不好。谢谢你的回复。你的方法比我想象的要好得多。我收到一个错误,说“找不到导入的模块数据。函数”如何修复此问题?Data.Function是基本库的一部分,因此您应该安装它。您使用的是GHC还是Hugs?哪个版本?我使用GHC,因此无法帮助您解决库问题,抱歉。请尝试将其作为一个新问题来问。请注意
(\w->(w,length w))
(length>=flip(,)
在pointfree中。@Matvey我发现
(id&&length)
可读性更高,尽管这两种方法都不适合初学者,但我认为这两种方法都不适合初学者。谢谢你的回复。这很有帮助:)不过请注意,你的解决方案会为每次比较重新计算字符串的长度,这会使长字符串的速度变慢,因为
长度
是O(n)。对于许多长字符串,dave4420的解决方案会更快,因为它会在排序之前“缓存”长度。@PeterWortmann:是的,这是一个非常好的观点。我确实在优化可读性而不是性能,应该在回答中明确这一点。谢谢你的回答。这很有帮助:)但是请注意,您的解决方案将为每次比较重新计算字符串的长度,使长字符串的计算速度变慢,因为
length
是O(n)。对于许多长字符串,dave4420的解决方案会更快,因为它会在排序之前“缓存”长度。@PeterWortmann:是的,这是一个非常好的观点。我肯定是在优化可读性,而不是性能,所以我应该