Haskell 检查子列表中是否存在元素
我的清单上有很多数字。每个图形的列表中可以有许多矩形。我的函数checkNewRectangleId有一个问题-这个函数应该向用户询问新的矩形id,直到他写下真正的新id,然后它应该返回这个id-但是我有一个错误:无法将预期的类型IO t与推断的类型相匹配可能是figureType lineHaskell 检查子列表中是否存在元素,haskell,monads,type-mismatch,Haskell,Monads,Type Mismatch,我的清单上有很多数字。每个图形的列表中可以有许多矩形。我的函数checkNewRectangleId有一个问题-这个函数应该向用户询问新的矩形id,直到他写下真正的新id,然后它应该返回这个id-但是我有一个错误:无法将预期的类型IO t与推断的类型相匹配可能是figureType line(Figure id宽度高度矩形)[figureType]->IO Int checkNewRectangleId idFigure x=do idRectangle可能是图形类型 findFigure[]=
(Figure id宽度高度矩形)[figureType]->IO Int
checkNewRectangleId idFigure x=do
idRectangle可能是图形类型
findFigure[]=无
findFigure n((图id宽度高度矩形):xs)=
如果n==id,则只需(图形id宽度高度矩形)
else findFigure n xs
findRectangle::Int->[RectangleType]->可能是RectangleType
findRectangle[]=无
findRectangle n((矩形id日期):xs)=
如果n==id,则只需(矩形id日期)
else findRectangle n xs
isInt i=非(空i)&全部为数字i
getInt::String->IO Int
getInt q=do
putstrq;
ifindFigure
在Maybe monad中运行,但checkNewRectangleId
在IO monad中运行。Haskell不会自动将一个单子中的失败(或成功)转换为另一个单子中的失败(或成功),因为类型不匹配。因此,你必须问自己这样一个问题,如果findFigure
找不到任何东西,你希望发生什么?findFigure
在Maybe monad中运行,但是checkNewRectangleId
在IO monad中运行。Haskell不会自动将一个单子中的失败(或成功)转换为另一个单子中的失败(或成功),因为类型不匹配。因此,你必须问自己一个问题,如果findFigure
找不到任何东西,你希望发生什么?既然你说idFigure
保证存在,你可以在数据中使用fromJust
。也许
模块将也许是figuetype
转换成figutterype
:
let (Figure id width height rectangles) = fromJust $ findFigure idFigure x
既然您说idFigure
保证存在,您可以在数据中使用fromJust
。Maybe
模块将Maybe FigureType
转换为FigureType
:
let (Figure id width height rectangles) = fromJust $ findFigure idFigure x
idFigure始终存在,因为我在调用函数checkNewRectangleId之前检查了它。idRectangle不能存在,在这种情况下,程序应该再次调用checkNewRectangleId idFigure x。idFigure始终存在,因为我在调用函数checkNewRectangleId之前检查了它。idRectangle不可能存在,在这种情况下,程序应该再次调用checkNewRectangleId idFigure x。在我看来,如果您已经在一个let
中,那么与Just
的模式匹配看起来比从Just$
开始的更干净。例如,let Just(地物id宽度高度矩形)=findFigure idFigure x
在我看来,如果您已经在一个let
中,那么与Just
的模式匹配看起来比fromJust$
更干净。例如let Just(图形id宽度高度矩形)=findFigure idFigure x