Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell IO函数类型不匹配_Haskell_Io_Functional Programming_Tuples_Monads - Fatal编程技术网

Haskell IO函数类型不匹配

Haskell IO函数类型不匹配,haskell,io,functional-programming,tuples,monads,Haskell,Io,Functional Programming,Tuples,Monads,以下代码有什么问题: nextMatch :: (a -> Bool) -> [IO a] -> (IO a, [IO a]) nextMatch f (x:xs) = do s <- x if f s then (return x, xs) else nextMatch f xs nextMatch::(a->Bool)->[IO a]->(IO a[IO a]) 下一个匹配f(x:xs)=do 函数应该返回一个元组。如果我的Haske

以下代码有什么问题:

nextMatch :: (a -> Bool) -> [IO a] -> (IO a, [IO a])
nextMatch f (x:xs) = do
    s <- x
    if f s then (return x, xs)
        else nextMatch f xs
nextMatch::(a->Bool)->[IO a]->(IO a[IO a])
下一个匹配f(x:xs)=do

函数应该返回一个元组。如果我的Haskell仍然达到PAR,我会尝试让PARANS围绕你的返回函数“如果F s然后(返回(x,xs)”),

你的函数应该返回一个元组。如果我的Haskell仍然达到PAR,我会试着把PARANS放在你的返回函数上,如果f s然后(返回(x,xs)”。

as <代码> x>代码>如果类型<代码> IO A < /C> >,不必重新返回它,相反,肯定需要注入到单元格中的元组。
if f s then return $ (x, xs)
但是,这不是唯一的问题,因为您进入了
IO
monad,并且您的签名没有反映它,因为您返回的类型是
(IO a,[IO a])
它应该是
IO(IO a,[IO a])
。 那么您的代码应该如下所示

nextMatch :: (a -> Bool) -> [IO a] -> IO (IO a, [IO a])
nextMatch f (x:xs) =  
  do 
    done <- fmap f x  
    if done
    then return $ (x, xs)
    else nextMatch f xs 
nextMatch::(a->Bool)->[IO a]->IO(IO a[IO a])
下一个匹配f(x:xs)=
做

作为
x
完成,如果类型为
ioa
,则无需重新返回,与元组相反,元组肯定需要注入monad

if f s then return $ (x, xs)
但是,这不是唯一的问题,因为您进入了
IO
monad,并且您的签名没有反映它,因为您返回的类型是
(IO a,[IO a])
它应该是
IO(IO a,[IO a])
。 那么您的代码应该如下所示

nextMatch :: (a -> Bool) -> [IO a] -> IO (IO a, [IO a])
nextMatch f (x:xs) =  
  do 
    done <- fmap f x  
    if done
    then return $ (x, xs)
    else nextMatch f xs 
nextMatch::(a->Bool)->[IO a]->IO(IO a[IO a])
下一个匹配f(x:xs)=
做

完成您不需要在这里处理
IO
。这就是我将它作为纯函数实现的方式(我添加了
Maybe
类型,因为可能没有下一个匹配):


作为初学者,如果您将带有
IO
的内容作为函数的输入,或者返回的数据结构中包含
IO
,则很可能是您做了一些错误的事情(可能是在您希望调用它的代码中)。

您不需要在这里处理
IO
。这就是我将它作为纯函数实现的方式(我添加了
Maybe
类型,因为可能没有下一个匹配):


作为初学者,如果您将带有
IO
的内容作为函数的输入,或者返回包含
IO
的数据结构,则很可能是您做了一些错误的事情(可能是在您希望调用它的代码中)。

您是对的,但是为了避免额外的计算,这对我的大脑来说是痛苦的,我参加了一个聚会,大多数时候我会用
return$expr
来代替
return-expr
。当然,当我必须编写专业代码时,此规则不适用,然后我会花时间问我是否必须使用
$
。无论如何,谢谢你的评论。@zurgl我最近得出结论,我需要在一元代码中使用更少的
$
。使用
>=
或应用程序风格会让人很痛苦,因为我一直觉得我可以转换
a>=f
,或者转换成
f g$b
,这让我很困惑,但是为了避免额外的计算,这对我的大脑来说是痛苦的,我参加了一个聚会,大多数时候我会用
return$expr
来代替
return-expr
。当然,当我必须编写专业代码时,此规则不适用,然后我会花时间问我是否必须使用
$
。无论如何,谢谢你的评论。@zurgl我最近得出结论,我需要在一元代码中使用更少的
$
。使用
>=
或应用程序风格会让人很痛苦,因为我一直觉得我可以转换
a>=f
,或者转换成
fg$b
。一般性的评论——一元参数(比如
IO[a]
,或者你的
[ioa]
)几乎总是个坏主意。不纯代码通常采用纯参数,使用do表示法或
>=
将它们应用于一元值。一般性评论——一元参数(如
IO[A]
,或您的
[IO A]
)几乎总是一个坏主意。不纯代码通常采用纯参数,使用do表示法或
>=
将它们应用于一元值。您的Haskell尚未“达到标准”:)您的Haskell尚未“达到标准”: