我正在做作業,其中一項任務是創建一個使有理數正常化的函式。這里的有理數由兩個整數定義(已經由教授確定,所以我無法更改)。這就是我想出的:
data Rat = Rat Integer Integer
normaliseRat :: Rat -> Rat
normaliseRat (Rat a b) = Rat (a `div` gcd a b) (b `div` gcd a b)
當我嘗試運行該函式時,出現此錯誤:
<interactive>:2:1: error:
* Couldn't match expected type `t0 -> t' with actual type `Rat'
* The function `normaliseRat' is applied to two value arguments,
but its type `Rat -> Rat' has only one
In the expression: normaliseRat 6 9
In an equation for `it': it = normaliseRat 6 9
* Relevant bindings include it :: t (bound at <interactive>:2:1)
我對 Haskell 和函式式編程完全陌生,所以如果它是一個簡單的解決方案,請原諒我。
uj5u.com熱心網友回復:
normaliseRat需要一個Rat引數,而不是用于構建Rat值的兩個整數。假設您的Rat型別有適當的Show實體,
> normaliseRat (Rat 6 9)
Rat 2 3
如果您想要一個智能建構式,Rat它確實需要兩個Integer引數,那就是
mkRat :: Integer -> Integer -> Rat
mkRat n d = let gcd' = gcd n d
n' = n `div` gcd'
d' = d `div` gcd'
in Rat n' d'
> mkRat 6 9
Rat 2 3
(智能建構式的目的是防止你像一開始那樣創建一個值Rat 6 9,只要你總是使用mkRat而不是Rat直接使用。mkRat也可以根據你現有的來定義normaliseRat:
mkRat :: Integer -> Integer -> Rat
mkRat n d = normaliseRat (Rat n d)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/532471.html
標籤:哈斯克尔函数式编程
