Haskell 检查子列表中是否存在元素

Haskell 检查子列表中是否存在元素,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[]=

我的清单上有很多数字。每个图形的列表中可以有许多矩形。我的函数checkNewRectangleId有一个问题-这个函数应该向用户询问新的矩形id,直到他写下真正的新id,然后它应该返回这个id-但是我有一个错误:无法将预期的类型IO t与推断的类型相匹配可能是figureType line
(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;

i
findFigure
在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