如何在Purescript中的记录数组中查找元素

时间:2019-12-15 15:32:04

标签: purescript

每个人。 我想在Purescript中的一系列记录中找到一个元素,但是由于我不熟悉Purescripot,因此无法解决。

我有一个数组banks,其中包含银行记录。

这是银行记录的类型。

type Bank = {
  id :: Int,
  name :: String
}

我想在banks中找到一家银行,其ID与给定的搜索ID相同。

我尝试如下:

find (_.id == searchId) banks

但出现此错误。


Could not match type
    Int
  with type
    Function
      { id :: t0
      | t1
      }

请帮助我解决这个简单的问题。

2 个答案:

答案 0 :(得分:4)

表达式import Alerts from '../layout/Alerts'; import AlertContext from '../../context/alert/alertContext'; const AddReviewModal = () => { const alertContext = useContext(AlertContext); const { setAlert } = alertContext; const [text, setText] = useState(''); const [rating, setRating] = useState(0); const onSubmit = () => { if (text === '') { setAlert('Review text cannot be empty', 'danger'); } else if (rating === 0) { setAlert('Please select a rating for your review', 'danger'); } else { console.log({ text, rating }); setText(''); setRating(0); } }; return ( <div id="add-review-modal" className="modal"> <div className="modal-content"> <h4>Add a review</h4> <Alerts /> <div className="row"> <p> <label> <input name="group1" type="radio" value={5} checked={rating === 5} onChange={() => setRating(5)} /> <span> <span className="fas fa-star" /> <span className="fas fa-star" /> <span className="fas fa-star" /> <span className="fas fa-star" /> <span className="fas fa-star" /> </span> </label> </p> <p> <label> <input name="group1" type="radio" value={4} checked={rating === 4} onChange={() => setRating(4)} /> <span> <span className="fas fa-star" /> <span className="fas fa-star" /> <span className="fas fa-star" /> <span className="fas fa-star" /> <span className="far fa-star" /> </span> </label> </p> <p> <label> <input name="group1" type="radio" value={3} checked={rating === 3} onChange={() => setRating(3)} /> <span> <span className="fas fa-star" /> <span className="fas fa-star" /> <span className="fas fa-star" /> <span className="far fa-star" /> <span className="far fa-star" /> </span> </label> </p> <p> <label> <input name="group1" type="radio" value={2} checked={rating === 2} onChange={() => setRating(2)} /> <span> <span className="fas fa-star" /> <span className="fas fa-star" /> <span className="far fa-star" /> <span className="far fa-star" /> <span className="far fa-star" /> </span> </label> </p> <p> <label> <input name="group1" type="radio" value={1} checked={rating === 1} onChange={() => setRating(1)} /> <span> <span className="fas fa-star" /> <span className="far fa-star" /> <span className="far fa-star" /> <span className="far fa-star" /> <span className="far fa-star" /> </span> </label> </p> <div className="input-field"> <input type="text" name="text" value={text} onChange={e => setText(e.target.value)} /> <label htmlFor="name" className="active"> Comment about your choice of rating </label> </div> </div> <div className="modal-footer"> <a className="waves-effect waves-light btn-large" href="#!" onClick={onSubmit} > Enter </a> </div> </div> </div> ); }; export default AddReviewModal; 是一个接受_.id并返回其Bank的函数(有点过分简化,但到目前为止已经足够了)。

说明:

id

然后使用该函数,并尝试将其与getId = _.id bank = { id: 42, name: "my bank" } getId bank == 42 (我假设它是一个数字)进行比较。

好吧,您不能将函数与数字进行比较,这就是编译器告诉您的:“ 无法将Int类型与Function类型匹配

函数searchId希望获得一个接受find并返回Bank的函数作为其第一个参数。产生这种功能的方法有很多,但是最明显的是使用lambda抽象:

Boolean

因此,将其插入您的代码中

\bank -> bank.id == searchId

答案 1 :(得分:1)

您可以像这样更改代码。

find(\{id} -> id == searchId) banks

因此您可以获得结果对象。