Şu anda Haskell'i öğreniyorum ve tipecilerin nasıl değerlendirildiğini ve let
ve where
'un nasıl çalıştığını anlamaya çalışıyorum. Bu kod iyi çalışır:Değerlendirmeler, nerede ve nerede Haskell
{-# LANGUAGE FlexibleInstances #-}
class Expr a where
literal :: Integer -> a
instance Expr Integer where
literal = id
instance Expr [Integer] where
literal i = [i]
coerceInteger :: Integer -> Integer
coerceInteger = id
main = print $ coerceInteger (literal 100) : literal 100 -- Prints [100,100]
ama
main = print $ coerceInteger expr : expr
where expr = literal 200
ana işlevi değişen bir derleyici hatası neden olur:
Couldn't match expected type `[Integer]' with actual type `Integer'
In the second argument of `(:)', namely `expr'
In the second argument of `($)', namely `coerceInteger expr : expr'
In the expression: print $ coerceInteger expr : expr
bunun ne tahmin ediyorum, çünkü ilk main
yönteminde literal 100
iki kez değerlendirilirken, ikinci örnekte literal 200
sadece bir kez değerlendirilir ve böylece derleyici bir tür seçmeye zorlanır.
Bu hataya neden olmadan, kendimi tekrar etmekten kaçınmak için bu kodu nasıl belirleyebilirim? let expr = literal 300 in ...
kullanmayı denedim, ancak aynı sorunla karşılaştı.