我改变了这个问题,使其更加清晰。 shortestStringHelper具有类型(Int - > Int - > Bool) - > [String] - >串。请注意,字符串可能显示为[Char],具体取决于Haskell当时的感受。这个函数看起来很像shortestString和shortestString',但它更通用,因为它需要一个函数作为参数(Int - > Int - > Bool)。注意:根据您的编写方式,您可以获得(Int - > Int - > Bool) - > [[a]] - > [a],这也没关系。 我知道怎么写find找到最短的字符串
shortestString :: [String] -> String
shortestString lst = if null lst then "" else foldl (\shortest x -> if length x < length shortest then x else shortest) (head lst) lst
shortestString' :: [String] -> String
shortestString' lst = if null lst then "" else foldl (\shortest x -> if length x <= length shortest then x else shortest) (head lst) lst
他们工作,但我不确定我是否理解这个问题,而且我不知道((Ord, Ord) -> Bool)
的意思。
答案 0 :(得分:0)
Ord
表示与Prelude
中的内容不兼容的内容,但通常您提供的类型签名将是具有两个参数的函数。
第一个参数的类型为(Ord, Ord) -> Bool
,该函数采用一对Ord
并返回Bool
。在上下文中,这可能是一个广义的比较函数,例如比较两个字符串的长度,表示为Ord
在这里的任何内容。这是不寻常的,因为您会希望像isShorter :: String -> String -> Bool
或isShorter :: [a] -> [a] -> Bool
那样写出类似的东西。
第二个参数的类型为[String]
,是String
个对象的列表。该函数返回单个String
。
但是,您没有向我们提供足够的信息来了解此特定任务中发生的情况。
修改:您已更新了问题,以便第一个参数的类型为(Int, Int) -> Bool
而不是(Ord, Ord) -> Bool
,这更有意义。对于需要一个参数的高阶函数,这可能是对两个参数进行比较的方法,例如两个字符串的长度。