使用无点符号时如何强制输入类型

时间:2018-09-11 12:20:52

标签: haskell pointfree

您好,在编写方法时,如何为GHCData.Text.read的{​​{1}}运算符等函数强制使用=~类型?

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

2 个答案:

答案 0 :(得分:11)

现代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

答案 1 :(得分:3)

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

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