【发布时间】:2014-03-28 16:58:44
【问题描述】:
我在看 presentation :“为什么 Monads 很重要?”
我简化了一个代码example,它可以编译并运行(请参见下文),但我仍然不明白它是如何工作的。
更准确地说:我不了解 composePref 函数。根据类型定义,它应该接受2个Ize类型的参数,并返回一个Ize类型的结果。 (Ize 在匈牙利语中的意思是“whatdoyoucallit”/thingy/某事。)
但是它需要三个参数(f g x),谁能解释一下composePref函数的工作原理以及f、g、x、y和c的类型是什么?
我不得不承认我是 Haskell 的初学者。也许我不明白在这种情况下柯里化是如何工作的?
module Dependence where
main = putStrLn (f "foo" cfg)
where f = right `composePref` right `composePref` left
cfg = 2
left :: Ize
left s = \i -> (repeatString i "< ") ++ s
right ::Ize
right s = \i -> s ++ (repeatString i " >")
repeatString :: Integer -> String -> String
repeatString i s = if (i <= 0)
then ""
else s ++ repeatString (i - 1) s
type Ize = String -> Integer -> String
composePref :: Ize -> Ize -> Ize
composePref f g x = \c -> let y = (g x) c
in (f y) c
产生输出:
< < foo > > > >
【问题讨论】: