为什么我的函数的返回类型是 a -> Int

Biskit1943

我的作业有问题,我必须编写一个程序,它的行为类似于wc. 我目前的方法如下:

import qualified Data.ByteString as BS
import qualified Data.ByteString.UTF8 as UTF8

numBytesUtf8 :: String -> Int
numBytesUtf8 = BS.length . UTF8.fromString

help = "Wrong number or wrong arguments provided.\n\
    \Possible arguments are: [l, w, c, b, ll]\n\n\
    \options:\n\
    \    -l  -> Return line count\n\
    \    -w  -> Return word count\n\
    \    -c  -> Return character count\n\
    \    -b  -> Return byte count\n\
    \    -ll -> Return character count of the longest line"

getLongestLine l r
    | r == []                = return l
    | length next > length l = getLongestLine next rest
    | otherwise              = getLongestLine l rest
    where
        next = head r
        rest = tail r

getLongestLineLength :: [Char] -> a -> Int
getLongestLineLength f = length . words . getLongestLine h t
    where
        l = lines f
        h = head l
        t = tail l

handleArgs :: [[Char]] -> [Char] -> IO ()
handleArgs args f
    | head args == "-l"  = print . length . lines $ f
    | head args == "-w"  = print . length . words $ f
    | head args == "-c"  = print . length $ f
    | head args == "-b"  = print . numBytesUtf8 $ f
    | head args == "-ll" = print ( getLongestLineLength f )
    | otherwise = putStrLn help

但是目前我收到以下错误:

    • No instance for (Show (a0 -> Int)) arising from a use of ‘print’
        (maybe you haven't applied a function to enough arguments?)
    • In the expression: print (getLongestLineLength f)
      In an equation for ‘handleArgs’:
          handleArgs args f
            | head args == "-l" = print . length . lines $ f
            | head args == "-w" = print . length . words $ f
            | head args == "-c" = print . length $ f
            | head args == "-b" = print . numBytesUtf8 $ f
            | head args == "-ll" = print (getLongestLineLength f)
            | otherwise = putStrLn help
   |
43 |     | head args == "-ll" = print ( getLongestLineLength f )
   | 

                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

我还是这门语言的新手,直到现在才出人意料。但我不知道如何处理a -> Int,也不知道如何打印。

任何帮助和其他提示都被挪用了:)

getLongestLine l r
    | r == []                = return l
    ....

return此处注入l任何 monad,使 的类型getLongestLine为以下形式

Monad m => something -> something -> m (something)

现在,这是一个事件:您可能不打算这样做。不幸的是,由于您也没有告诉 GHCgetLongestLine预期的类型什么,GHC 推断出上面意外的类型并继续前进,导致程序稍后出现问题。使用类型签名时getLongestLine,您会在此处遇到类型错误。

你很不走运,因为错误return可能会导致类型错误,但在这种情况下没有。

确实,稍后会选择 monad,(->) a因为您使用组合

length . words . getLongestLine h t

这导致类型

getLongestLineLength :: [Char] -> a -> Int

有一个额外的不需要的a参数,并getLongestLineLength使用两个参数而不是一个参数(第二个参数被传递给getLongestLine,并在那里被忽略)。

当你最终只通过一个参数时,GHC 终于抱怨了。

该怎么办:

  1. return除非您正在使用 monad,否则不要使用使用l代替return l
  2. 总是注释你的函数的类型,这样 GHC 可以在出现问题时尽早抱怨,而不是在推断出意外类型之后很久才抱怨。

您的代码中还有其他几个问题,您可能需要进行一些重大更改。我建议您尽早使用 将字符串拆分为单词words,然后将结果传递[String]给程序的其余部分。不是计算最长的线,然后计算其长度,而是先计算长度,然后取最大值。

longestWordLength :: String -> Int
longestWordLength = maximum . map length . words

与您的问题没有密切关系,但一般建议:

  1. 不要使用head, tail, l==[]尽可能使用模式匹配而不是守卫。
  2. 打开警告-Wall并解决它们。这会将丢失的类型签名报告给getLongestLine,从而导致误解。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么将此表达式的返回类型计算为返回类型unit-> int而不是int

为什么我收到非数字类型* int错误?

为什么我的sig_int()函数无法阻止我的函数在c中退出?

为什么使用别名int&允许创建非函数类型const(int&)?

当从具有通用(Int)返回类型的函数返回Dynamic(String)时,Haxe编译器为什么不抱怨?

为什么我们不能将int变量与c中的int返回类型函数进行比较?

为什么函数“ lower”具有int作为返回类型和输入类型?

为什么我可以在函数后返回“ int”而不是“ char *”?

为什么C ++ std :: min_element库函数接受使用bool返回类型的函数对象而不是像C中的int的函子?

为什么在使用CHAR类型的参数调用时构造函数选择INT类型而不是SHORT?

为什么函数brk()的参数为void *而不是int类型?

为什么颤振返回类型'List <dynamic>'不是'函数结果'的类型'List <int>'的子类型?

从堆获取内存时,为什么我可以在const int **类型中更改int *的值

为什么Java类型推断在int数组的集合的构造函数中失败,例如PriorityQueue <int []>?

为什么它显示我的函数在返回char *时返回int?

为什么没有round()类型的函数返回一个int?

从查询返回int值的int类型函数的返回值是什么

为什么输入流的返回类型不为int?

为什么我的int不能正确返回?

为什么int类型方法允许字符类型作为返回值?

为什么我的函数返回一个Unit而不是Int?

什么是“ Int-> Int”类型?当一个函数作为返回值?

为什么是 int 类型错误?类型错误

从函数返回 int 类型的数组的问题

unsigned int 函数的返回类型

为什么我的异步函数返回一个 Future<int> 在等待每个时停顿?

为什么我得到无效类型 float[int] 数组下标?

为什么我的数组是 var int 类型而不是 var set of int?

当我的函数返回 int 时,为什么 Remix 说返回 int256?