使用无点表示法时如何强制类型

How to enforce type when using point free notation

你好,在编写方法时,如何为 Data.Text.readText.Regex.Posix 中的 =~ 运算符等函数强制执行 GHC 类型?

示例:
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

现代 Haskell 的最佳方式是使用 type application

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

read 的类型为 String -> a,因此 read x 的类型为 a。就像强制 read x 使用 Double 而不是 aread x :: Double 一样,您可以强制 read 使用 String -> Double 类型:

b = map (read :: String -> Double) a