::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;)


以上是::Wrapper类型在Haskell中是什么意思?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>