我正在嘗試在 Haskell 中撰寫一個函式,并嘗試用兩個讓后跟答案來啟動該函式。
split :: (a -> b) -> (a -> c) -> a -> (b, c)
split x y z =
let first = ( x (y))
let last = ( y (Z))
(first, last)
從第二個 let 陳述句開始,我收到“輸入'let' 上的決議錯誤”。為什么會這樣,我該如何解決?
uj5u.com熱心網友回復:
split :: (a -> b) -> (a -> c) -> a -> (b, c)
這表示您的第一個引數是從某種型別a
到某種型別b
的函式,而您的第二個引數是從某種型別a
到某種型別的函式c
。
split x y z =
所以x :: a -> b
和y :: a -> c
。
let first = ( x (y))
這意味著您正在嘗試將函式x
應用于y
但這不起作用,因為x
需要一個 type 的引數a
并且y
是 type a -> c
。這是錯誤的。
let last = ( y (Z))
沒有Z
,請檢查您的大小寫。
(first, last)
從語法上講,您需要一個in
. 語法是:
let var1 = expr1
var2 = expr2
in expr3WithVars1And2InScope
一個小例外:使用do
塊時您不使用in
,因為這隱含地是塊的其余部分do
。
uj5u.com熱心網友回復:
這里不需要使用 a let
,你可以用一個簡單的 2 元組做一個運算式:
split :: (a -> b) -> (a -> c) -> a -> (b, c)
split x y z = (x z, y z)
或者您可以將其簡化為:
split :: (a -> b) -> (a -> c) -> a -> (b, c)
split x y = (,) <$> x <*> y
甚至更簡單:
import Control.Applicative(liftA2)
split :: (a -> b) -> (a -> c) -> a -> (b, c)
split = liftA2 (,)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/508450.html