Как обеспечить тип при использовании бессмысленной нотации - PullRequest
0 голосов
/ 11 сентября 2018

Здравствуйте, как вы можете применять тип GHC для таких функций, как Data.Text.read или оператор =~ из Text.Regex.Posix при составлении методов?

пример:
a=["1.22","3.33","5.55"]

Без точки:
b= map (\x-> read x ::Double) a

Как ввести тип для read с нотацией без точки?

b=map read::Double a или
b= map (read . f1 .f2 .f3... . fn )::Double a (при составлении методов)
, где f1 , f2 ...fn - методы

Или лучше, как указать тип read, когда он принадлежит цепочке методов, НО не в конце цепочки!:
b=map (f2 . read . f1 ) a

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

read имеет тип String -> a, поэтому read x имеет тип a. Точно так же, как * * * * * * * * * * * * * * * * * * * * * * * * * * read x :: Double * * * * * * * * * * * * * * * * 100 * * * * * * * * * 100 * * * * * * * * * * 100 "

b = map (read :: String -> Double) a
0 голосов
/ 11 сентября 2018

Лучший способ в современном Haskell - использовать приложение типа .

Prelude> :set -XTypeApplications 
Prelude> map (read @Double) ["1.22","3.33","5.55"]
[1.22,3.33,5.55]
Prelude> map (read @Int) ["1.22","3.33","5.55"]
[*** Exception: Prelude.read: no parse

Это работает, потому что read имеет подпись

read :: ∀ a . Read a => String -> a

и, следовательно,read @Double специализируется a ~ Double и, следовательно,

read @Double :: String -> Double
...