处理Js.Nullable的正确方法是什么?

时间:2018-03-28 07:10:47

标签: nullable reason bucklescript

我试图做以下事情:

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

lattd, lngtd = [], []

# latitude, longitude and station names are as headers rows(rows starting with "#", in plot_file.txt. 
# read all the lines and make lists for latitude and longitude

inputfile =  open('data-por-IN/plot_file.txt', 'r')   
for i, line in enumerate(inputfile):    
    if line.startswith('#'):
        lattd.append(int(line[56:62])/10000)
        lngtd.append(int(line[65:71])/10000)

m = Basemap(width=4000000,height=4000000,projection='lcc',
            resolution='c',lat_1=45.,lat_2=55,lat_0=20,lon_0=80.)
m.drawmapboundary(fill_color='aqua')
m.drawcountries()
m.drawcoastlines(linewidth=0.50)
m.fillcontinents(color='green', alpha = 0.6, lake_color='aqua')
for i in range(len(lngtd)):
    lon = lngtd[i] #77.580643
    lat = lattd[i] #12.972442 
    xpt,ypt = m(lon,lat)
    lonpt, latpt = m(xpt,ypt,inverse=True)
    m.plot(xpt,ypt,'yo')
    ax.bluemarble()

plt.show()

但当然,我收到以下投诉:

let str_result: Js.Nullable.t(string) = Js.Nullable.return("something");
let int_result: Js.Nullable.t(int) = Js.Nullable.fromOption(Some(5));
Js.log([|str_result, int_result|]);

所以我使用Error: This expression has type Js.Nullable.t(int) = Js.nullable(int) but an expression was expected of type Js.Nullable.t(string) = Js.nullable(string) Type int is not compatible with type string

string_of_int

但是我遇到了以下问题:

Js.log([|str_result, string_of_int|]);

使用This has type: Js.Nullable.t(int) (defined as Js.nullable(int)) But somewhere wanted: int 的正确方法还是有其他方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以使用Js.Nullable.t更改Js.Nullable.bind的“内部”类型:

let str_of_int_result: Js.Nullable.t(string) =
  Js.Nullable.bind(int_result, (. n) => string_iof_int(n));

或者,您可以将Js.Nullable.t转换为option,模式匹配,然后可选地将其再次包装在Js.Nullable.t中:

let str_of_int_result: Js.Nullable.t(string) =
  switch (Js.Nullable.toOption(int_result)) {
  | Some(n) => Js.Nullable.return(string_of_int(n)))
  | None    => Js.Nullable.null
  };

为了便于比较,这些是等效的。如果你想让它保持Js.Nullable.t,你通常会想要使用第一种方法,如果不想,你可以使用第二种方法。

答案 1 :(得分:0)

在使用ReasonReact Ref访问DOM节点时,我正在使用以下内容将DOM节点作为对象(也称为Js.t<'a>)进行访问。

let nodeRef = React.useRef(Js.Nullable.null)

...

switch Js.Nullable.toOption(nodeRef.current) {
| None => ()
| Some(node) => {
    let node = ReactDOMRe.domElementToObj(node)
    node["scrollTop"] = node["scrollHeight"]
  }
}

...

<main ref={ReactDOM.Ref.domRef(nodeRef)}>