使用无点表示法时如何强制类型
How to enforce type when using point free notation
你好,在编写方法时,如何为 Data.Text.read
或 Text.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
而不是 a
和 read x :: Double
一样,您可以强制 read
使用 String -> Double
类型:
b = map (read :: String -> Double) a
你好,在编写方法时,如何为 Data.Text.read
或 Text.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
而不是 a
和 read x :: Double
一样,您可以强制 read
使用 String -> Double
类型:
b = map (read :: String -> Double) a