【发布时间】:2018-10-26 05:46:28
【问题描述】:
我正在 Haskell wiki 中尝试这个练习:https://en.wikibooks.org/wiki/Haskell/Higher-order_functions
下面的练习结合了你所学到的更高层次的知识 顺序函数、递归和 I/O。我们将重建什么是 在命令式语言中称为 for 循环。实现一个功能
for :: a -> (a -> Bool) -> (a -> a) -> (a -> IO ()) -> IO () for i p f job = -- ???
目前为止:
-- for : init value, end condition function, increment function, IO function,
-- returns IO action
generate :: a -> (a->Bool) -> (a->a) -> [a]
generate s cnd incr = if (cnd s) then [] else [s] ++ generate (incr s) cnd incr
printToList = do
u <- print 1
v <- print 2
return [u,v]
ioToASingle :: [IO a] -> IO [a]
ioToASingle (x:xs) = do
x' <- x
return [x']
sequenceIO :: [IO a] -> IO [a]
sequenceIO [] = return []
sequenceIO (x:xs) = do
x' <- x
xs' <- sequenceIO xs
return ([x'] ++ xs')
for::a->(a->Bool)->(a->a)->(a->IO())->IO()
for s cnd incr ioFn = sequence_ (map (ioFn) (generate s cnd incr))
for'::a->(a->Bool)->(a->a)->(a->IO a)->IO [a]
for' s cnd incr ioFn = sequenceIO (map (ioFn) (generate s cnd incr))
for 工作正常:
for 1 (\i->i==10) (\i->i+1) (print)
1
2
3
4
5
6
7
8
9
for' 出现错误:
*Main> for' 1 (\i->i==10) (\i->i+1) (print)
<interactive>:323:6: error:
• No instance for (Num ()) arising from the literal ‘1’
• In the first argument of ‘for'’, namely ‘1’
In the expression: for' 1 (\ i -> i == 10) (\ i -> i + 1) (print)
In an equation for ‘it’:
it = for' 1 (\ i -> i == 10) (\ i -> i + 1) (print)
*Main>
我不知道出了什么问题。
【问题讨论】:
-
(print)的类型是Show a => a -> IO (),而不是Show a => a -> IO a。你需要将它与其他东西结合起来,让它返回输入。
标签: loops haskell types monads higher-order-functions