相关疑难解决方法(0)

Variadic列表构造函数,如何默认为正确的类型并获得类型安全性

这是我得到的:

{-# LANGUAGE MultiParamTypeClasses
           , FlexibleInstances #-}

class ListResultMult r a where
  lstM :: a -> [a] -> r

listM :: ListResultMult r a => a -> r
listM a = lstM a []


instance ListResultMult r a => ListResultMult (a -> r) a where
  lstM a as x = lstM x $ a:as

instance ListResultMult [a] a where
  lstM a as = reverse $ a:as
Run Code Online (Sandbox Code Playgroud)

以下是它的工作原理:

> listM 'a' 'b' 'c' :: String
"abc"
> putStrLn $ listM 'a' …
Run Code Online (Sandbox Code Playgroud)

haskell variadic-functions type-safety

6
推荐指数
1
解决办法
186
查看次数

我需要什么类型的签名才能将函数列表转换为haskell代码?

可能重复:
为什么haskell中不允许这样的函数定义?

我做了一个名为haskell的函数funlist.它的作用是获取起始值和函数列表,并将列表中的所有函数应用于起始值.

funlist thing [function] = function thing
funlist thing (function:functions) = funlist (function thing) functions
funlist _ _ = error "need a list of functions"
Run Code Online (Sandbox Code Playgroud)

这个函数的问题在于它有一种类型funlist :: t -> [t -> t] -> t.该类型意味着虽然ghc将允许不将起始值转换为完全不同类型的函数列表(例如[sin,cos,tan]将被允许​​),但是将起始值转换为不同类型(例如show)的函数将生成错误因为该功能与类型签名不匹配.

这不是该功能应该如何工作.它应该能够获取更改起始值类型的函数列表(例如[sin,show]).这个函数基本上转换funlist 5 [sin,cos,tan,isInfinite,show]show $ isInfinite $ tan $ cos $ sin $ 5,而后者工作,前者则不然.

有什么办法可以让这个功能正常工作吗?

编辑:我知道.>>>,我只是想知道,如果有一种方法,使这项工作.

haskell

3
推荐指数
3
解决办法
316
查看次数

Haskell,多变量函数和类型推断

在寻找Polyvariadic函数示例时,我发现了这个资源: StackOverflow:如何创建polyvariadic haskell函数?,有一个这样的答案片段:

class SumRes r where 
  sumOf :: Integer -> r

instance SumRes Integer where
  sumOf = id

instance (Integral a, SumRes r) => SumRes (a -> r) where
  sumOf x = sumOf . (x +) . toInteger
Run Code Online (Sandbox Code Playgroud)

然后我们可以使用:

*Main> sumOf 1 :: Integer
1
*Main> sumOf 1 4 7 10 :: Integer
22
*Main> sumOf 1 4 7 10 0 0  :: Integer
22
*Main> sumOf 1 4 7 10 2 5 8 22 :: Integer
59 …
Run Code Online (Sandbox Code Playgroud)

recursion haskell typeclass polyvariadic

3
推荐指数
1
解决办法
192
查看次数