我正在编写一个函数parseArgs
,它将以列表的形式接收命令行参数。如果列表的大小为2,则该函数将解析列表的内容并将其转换为元组,否则返回Nothing
。我不确定如何解决这个问题;到目前为止我的代码如下:
parseArgs :: [String] -> Maybe (String, Maybe String)
parseArgs [x, y]
| length [x, y] < 2 = Nothing
| length [x, y] > 2 = Nothing
| otherwise = Just (x, Just y)
答案 0 :(得分:7)
在你的代码中,
parseArgs [x, y]
表示它只接受两个元素的列表。
因此length [x, y]
将始终为2,并且永远不会满足那些(&gt; 2)(&lt; 2)条件。
otherwise
将始终是两个元素的列表。所以当输入是两个元素的列表时,你可以得到x和y,并确保它们是一个Maybe元组。
但除此之外,如果您parseArgs []
parseArgs ["a"]
parseArgs ["a","b","c"]
,您会收到异常“函数parseArgs中的非详尽模式”。
这是因为代码没有涵盖[String]
我在这里使用Maybe(String,String)作为输出。这意味着parseArg将生成Just(String,String)或Nothing。也许它更接近你想要的东西。
所以试试这个:
parseArgs :: [String] -> Maybe (String, String)
parseArgs x:y:[] = Just (x,y)
parseArgs xs = Nothing
这意味着如果输入[String]碰巧是x:y:[](精确两个字符串的列表),则生成Just(x,y)。除此之外,什么都不做。这样,它涵盖了[String]中的所有模式。然后,当它不是两个元素的列表时,您可以获得Nothing
。
编辑:
第二个是@ pdoherty926的parseArgs _ = Nothing
,通配符_是表达“其他一切”的更好方式。
答案 1 :(得分:5)
根据您的要求,我不清楚为什么第二个元组元素是const PollOption = ({options, onChange, selectedValue}) => {
return (
<div className="pollOption">
{options.map((choice, index) => (
<label key={index}>
<input type="radio"
name="vote"
value={choice.value}
key={index}
checked={selectedValue === choice.value}
onChange={(e) => onChange(e.target.value)}/>
{choice.text}
</label>
))}
</div>
);
};
class OpinionPoll extends Component{
constructor(props) {
super(props);
this.state = {selectedOption: ''}
}
handleClick(){
console.log('button clicked');
}
handleOnChange(val){
console.log('foo', val);
}
render(){
return (
<div className="poll">
{this.props.model.question}
<PollOption
options={this.props.model.choices}
onChange={(val) => this.handleOnChange(val)}
selectedValue={this.state.selectedOption}
/>
<button onClick={() => this.handleClick()}>Vote!</button>
</div>
);
}
}
。所以,我将继续进行,就好像你的函数类型是:Maybe String
parseArgs :: [String] -> Maybe (String, String)