Строковая интерполяция в Хаскеле

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
20
задан Chris Martin 21 January 2016 в 08:42
поделиться

6 ответов

На самом деле строки - это просто списки. Таким образом, вы можете преобразовать число, возвращаемое из длины, и добавить его к другой строке с помощью обычных функций списка:

print $ "length [1,2,3] " ++ show (length [1,2,3])
15
ответ дан 29 November 2019 в 22:26
поделиться

Вы также можете просто использовать 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, если вам нужны более интересные ситуации.

36
ответ дан 29 November 2019 в 22:26
поделиться

Попробуйте это в ghci:

Prelude> :t print
print :: (Show a) => a -> IO ()

Как видите, функция print принимает только один аргумент, в то время как приведенный выше код предоставляет два.

Вместо этого попробуйте это:

putStrLn ("length [1,2,3] => " ++ show (length [1,2,3]))

Он соединяет две строки с помощью ++ и затем печатает их.

4
ответ дан 29 November 2019 в 22:26
поделиться

В то время как другие плакаты здесь упоминают многие из «правильных» способов интерполяции строк, есть более изящный способ с использованием квазиквотирования и библиотеки 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)]

последний имеет тенденцию выглядеть лучше с точки зрения кода, когда вы склеиваете много фрагментов строки.

33
ответ дан 29 November 2019 в 22:26
поделиться

В дополнение к тому, что говорили другие, вы также можете использовать оператор монадического связывания >> для объединения двух действий ввода-вывода:

putStr "length [1,2,3]: " >> print (length [1,2,3])

Это эквивалентно объединению их с do- обозначение:

do putStr "length [1,2,3]: "
   print (length [1,2,3])
4
ответ дан 29 November 2019 в 22:26
поделиться

Вы можете использовать что-то вроде

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.

3
ответ дан 29 November 2019 в 22:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: