【问题标题】:haskell show with function application带有功能应用程序的haskell show
【发布时间】:2018-04-21 14:08:45
【问题描述】:

Haskell 中的这行代码在编译时会产生错误:

lineStat :: String -> [String]
lineStat xs =  zipWith (\n line -> show n ++ " " ++ show $ length line) [1..] $ lines xs

错误: 无法将预期类型 Int -> String 与实际类型 [Char] 匹配 ($) 的第一个参数有一个参数,但它的类型[Char] 没有

但是这行代码有效:

lineStat xs =  zipWith (\n line -> show n ++ " " ++ show (length line)) [1..] $ lines xs

为什么?

【问题讨论】:

    标签: haskell show


    【解决方案1】:

    这是一个优先级问题。

    show n ++ " " ++ show $ length line
    

    意思

    (show n ++ " " ++ show) (length line)
    

    这是没有意义的,因为show 不是字符串。这并不意味着

    show n ++ " " ++ (show (length line))
    

    要得到想要的,你需要括号。使用其中之一:

    zipWith (\n line -> show n ++ " " ++ show (length line)) [1..] $ lines xs
    -- or
    zipWith (\n line -> show n ++ " " ++ (show $ length line)) [1..] $ lines xs
    

    我更喜欢前者,因为它更简单。

    【讨论】:

      【解决方案2】:

      您的问题归结为:

      *Main> let line = "abc"
      *Main> " " ++ show (length line)
      " 3"
      *Main> " " ++ show $length line
      <interactive>:9:1: error:
          • Couldn't match expected type ‘Int -> t’ with actual type ‘[Char]’
      

      根本原因是$的优先级低于++

      *Main> :info (++)
      ...
      infixr 5 ++
      *Main> :info ($)
      ...
      infixr 0 $
      

      Haskell Report中所定义

      因此,您需要在show $ length line 周围加上括号。

      【讨论】:

        猜你喜欢
        • 2022-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 2012-06-15
        • 2012-01-20
        • 1970-01-01
        相关资源
        最近更新 更多