Swift 4, без использования preferredLanguages у меня были проблемы с fr_US и decimalPad
extension String {
func number(style: NumberFormatter.Style = .decimal) -> NSNumber? {
return [[Locale.current], Locale.preferredLanguages.map { Locale(identifier: $0) }]
.flatMap { $0 }
.map { locale -> NSNumber? in
let formatter = NumberFormatter()
formatter.numberStyle = style
formatter.locale = locale
return formatter.number(from: self)
}.filter { $0 != nil }
.map { $0! }
.first
}
}
textfield.text?.number()?.floatValue
На самом деле строки - это просто списки. Таким образом, вы можете преобразовать число, возвращаемое из длины, и добавить его к другой строке с помощью обычных функций списка:
print $ "length [1,2,3] " ++ show (length [1,2,3])
Вы также можете просто использовать Text.Printf
, который включен в базовые библиотеки GHC:
> let format s = printf "length %s => %d\n" (show s) (length s)
> format [1,2,3]
length [1,2,3] => 3
На Hackage http: / есть несколько пакетов интерполяции строк. /hackage.haskell.org, если вам нужны более интересные ситуации.
Попробуйте это в ghci:
Prelude> :t print
print :: (Show a) => a -> IO ()
Как видите, функция print
принимает только один аргумент, в то время как приведенный выше код предоставляет два.
Вместо этого попробуйте это:
putStrLn ("length [1,2,3] => " ++ show (length [1,2,3]))
Он соединяет две строки с помощью ++
и затем печатает их.
В то время как другие плакаты здесь упоминают многие из «правильных» способов интерполяции строк, есть более изящный способ с использованием квазиквотирования и библиотеки interpolatedstring-perl6:
{-# LANGUAGE QuasiQuotes, ExtendedDefaultRules #-}
import Text.InterpolatedString.Perl6 (qq)
main = putStrLn [$qq| length [1,2,3] => ${length [1,2,3]} |]
Фактически существует также библиотека interpolatedstring-qq , которая предлагает синтаксис Ruby.
{-# LANGUAGE QuasiQuotes, ExtendedDefaultRules #-}
import Text.InterpolatedString.QQ (istr)
main = putStrLn [$istr| length [1,2,3] => #{length [1,2,3]} |]
Тем не менее, вам, вероятно, следует просто использовать show и ++ или concat для склеивания строк
main = putStrLn $ "length [1,2,3] => " ++ show (length [1,2,3])
или
main = putStrLn $ concat ["length [1,2,3] => ", show $ length (1,2,3)]
последний имеет тенденцию выглядеть лучше с точки зрения кода, когда вы склеиваете много фрагментов строки.
В дополнение к тому, что говорили другие, вы также можете использовать оператор монадического связывания >>
для объединения двух действий ввода-вывода:
putStr "length [1,2,3]: " >> print (length [1,2,3])
Это эквивалентно объединению их с do- обозначение:
do putStr "length [1,2,3]: "
print (length [1,2,3])
Вы можете использовать что-то вроде
putStr "length [1,2,3] => "
print (length [1,2,3])
EDIT:
Если вы хотите сделать это как функцию, передать любой список и записать его длину, вы можете сделать это следующим образом:
print_length :: Show a => [a] -> IO ()
print_length xs = print ("length " ++ show xs ++ " => " ++ show (length xs))
Main> print_length [1,2,3,4,5]
"length [1,2,3,4,5] => 5"
Main> print_length []
"length [] => 0"
Конечно, как было сказано выше, вы можете использовать putStrLn
вместо print.