2017-11-08 2 views
1

diese Zeile Code in Haskell Fehler auf Compilation produziert:Haskell-Show mit Funktionsanwendung

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

Fehler: Typ konnte nicht Int -> String mit tatsächlichen Typ erwarteten übereinstimmen [Char] Das erste Argument ($) nimmt ein Argument, aber seine Art [Char] hat keine

jedoch diese Zeile Code funktioniert:

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

Warum?

Antwort

4

Es ist ein Präzedenzfall.

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

bedeutet

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

, die keinen Sinn machen, da show keinen String. Es bedeutet nicht

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

Um das gewünschte zu erhalten, benötigen Sie Klammern. Verwenden Sie eine von diesen:

Ich würde ersteres bevorzugen, da es einfacher ist.

2

Ihr Problem läuft darauf hinaus:

*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]’ 

Die Ursache dafür ist, dass $ niedrigere Priorität als ++ hat:

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

wie im Haskell Report

definiert Daher Sie Brauchen Klammern um .

Verwandte Themen