::Wrapper类型在Haskell中是什么意思?
我认为一切都是 Haskell 中的函数。例如:
sum :: Int -> Int
sum a b = a+b
但是有这样的事情:
tom :: Reader String String
这究竟是什么意思?什么是tom?一个什么都得不到并返回的函数Reader String String?
回答
并非一切都是函数。例如,
x :: Char
x = 'w'
在上面的例子中,x不是一个函数。
至于Reader String String,这只是 的newtype别名String -> String。为了在两者之间转换,我们有
runReader :: Reader a b -> (a -> b)
reader :: (a -> b) -> Reader a b
一个人可以用Reader. 例如,考虑
average :: [Double] -> Double
average list = sum list / fromIntegral (length list)
请注意,我们传入list了两个不同的函数。另一方面,我们可以改写
average :: [Double] -> Double
average = runReader $ do sumList <- reader sum
lengthList <- reader length
return (sumList / fromIntegral lengthList)
有了第二个平均值的定义,我们可以使用 reader monad 完全消除对list参数的使用,而是使用 monadicdo表示法来消除对它的需要。
这是否使代码更容易理解或更难是一个有趣的问题。
回答
您可能会将其视为没有参数的函数 - 在某种程度上可以工作......一段时间。
但更好的答案可能是不 - 并非 Haskell 中的所有内容都是函数- 也只有值,我将其称为type 值Reader String String。
与"Hello"或相同5
顺便说一句,Reader这只是一个函数的包装器Reader a b ~ a -> b;)