从Haskell类型同义词中提取值

时间:2017-11-17 21:17:45

标签: haskell

我正在为课堂编写多米诺骨牌游戏而无法绕过自定义类型。我有:

fn lazy_slice(n: i64) {
    let array = [1i64, 2, 3, 4, 5];
    let mut iter: Box<Iterator<Item = i64>> = Box::new(array.iter().cloned());
    for _ in 0..n {
        iter = Box::new(iter.map(|x| x + 1));
    }
    println!("{:?}", iter.collect::<Vec<_>>());
}

尝试加载这会给我带来错误:

  

Dominoes.hs:43:3:错误:

     

•无法匹配预期类型'(Int,Hand,Board)'                    实际类型'Board - &gt; (Int,b0,Board)'

     

•'playTurn'的等式有两个参数,        但它的类型'DomsPlayer - &gt; (Int,Hand,Board)'只有一个

     

|   43 | playTurn hand1 board1 =(得分,hand2,board2)| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...

     

Dominoes.hs:44:37:错误:

     

•无法匹配类型'手 - &gt;董事会 - &gt; (多米诺,结束)'                        用'[Domino]'

     

预期类型:手         实际类型:DomsPlayer

     

•可能的原因:'hand1'适用于太少的参数

     

在'simplePlayer'的第一个参数中,即'hand1'

     

在表达式中:simplePlayer hand1 board1

     

在模式绑定中:(dom,end)= simplePlayer hand1 board1

     

|   44 | where(dom,end)= simplePlayer hand1 board1 |

如何从DomsPlayer中检索值?

1 个答案:

答案 0 :(得分:0)

如果将此DomsPlayer替换为其定义

type DomsPlayer = Hand -> Board -> (Domino,End)

playTurn :: (Hand -> Board -> (Domino,End)) -> (Int, Hand, Board)

你会看到playTurn只收到一个参数,而不是两个参数。

我不知道你要做什么,但显然你需要将HandBoard作为单独的参数接收:

playTurn :: Hand -> Board -> ... -> (Int, Hand, Board)

我也不知道,也许也会传递DomsPlayer类型的函数,并将其应用于那些单独的参数。

但这是你的错误。