Haskell列表到元组

时间:2017-11-11 04:16:12

标签: list parsing haskell tuples

我正在编写一个函数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)

2 个答案:

答案 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)

@Johhny Liao打败了我,但这是我的回答:

根据您的要求,我不清楚为什么第二个元组元素是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)