如何在Haskell中使用函数

时间:2019-01-02 12:08:14

标签: haskell currying

我有一个函数multThree,用于将3个数字相乘,这适用于curring。但是,当我尝试将其扩展为使用相同结构将四个数字相乘时,它不起作用。为什么会这样,如何解决?

class Dashboard extends Component {

   constructor(props) {
    super(props);
    this.state = {
      systemDetailsData: null,
     }
   }
   CalledFromHeader = (systemDetailsData11) => {
     this.setState({ systemDetailsData:systemDetailsData11 })
   }
   
   redner(){
    return <Header changeState={this.CalledFromheader} />
   }
}



  class Header extends Component {
    constructor(props) {
      super(props);
    }
    
    render(){
      return(
        // something view onPress handler
        <Button onPress={()=>{
          this.props.CalledFromHeader('Some parameters')
        }} />
      )
    }
 }

给出错误:

multThree :: Num a => a -> (a -> (a -> a))
multThree x = (*) . (*) x

multFour :: Num a => a -> (a -> (a -> (a -> a)))
multFour x = (*) . (*) . (*) x

1 个答案:

答案 0 :(得分:4)

让我们在没有(.)的情况下写出来:

multFour x = (*) . (*) . (*) x
= (*) . (\y -> (y*)) . (x*)
= (\w -> (w*)) . (\z -> ((x*z)*))
= (\w -> (w*)) . (\z v -> x*z*v)
= \z -> \u -> (\v -> x*z*v) * u

因此,我们看到我们正在尝试将一个函数乘以一个数字。

关键错误是这样:

multFour x = (*) . multThree x

类型为:

(*) :: Num a => a -> (a -> a)
multThree x :: Num b => b -> (b -> b)
x :: b
(.) :: (y -> z) -> (x -> y) -> (x -> z)

因此类型统一为:

a = y
z = (a -> a)
b = x
y = b -> b
multFour :: Num b => b -> x -> z
multFour :: (Num b, Num (b -> b)) => b -> b -> (b -> b) -> (b -> b)

这不是您想要的类型。

要修正您的代码,我建议:

multFour a b c d = a * b * c * d

这更具可读性。